如何通过解析列值来获取结果表?

时间:2014-11-13 09:34:14

标签: sql-server

我有一个表,其中一列(DateList,varchar(4000))包含日期时间值列表作为字符串。它看起来如下:

2014-09-26 19:00 2014-09-27 19:00 2014-09-28 19:00 2014-09-29 19:00

如何获得具有相同结构的结果表,但DateList列应具有某些范围内的值:

dateItem >= minDate and dateItem <= maxDate

它可能是存储过程。

我使用过的代码:

declare @sString VARCHAR(4000)
DECLARE @SplitChar CHAR(1)
DECLARE @Count INT
DECLARE @DateLength INT 
DECLARE @XMLString XML

SET @SplitChar = ','
SET @Count = 1      
SET @DateLength = 17

SELECT @sString = DateList from T_Action where ID = 44404
PRINT @sString

WHILE @Count <= Len(@sString) / 17 - 1
BEGIN
  SET @sString = STUFF(@sString, @DateLength, 0, ',')

  SET @DateLength = 17 + @DateLength + 1
  SET @Count = @Count + 1
END

--Use XML to extract the Date.
SET @XMLString = CONVERT(xml,'<root><s>' + REPLACE(@sString,@SplitChar,'</s><s>') + '</s></root>')

CREATE TABLE #Temp (DateVal VARCHAR(20))

INSERT INTO #Temp (DateVal)
SELECT DateValue 
FROM (SELECT T.c.value('.','VARCHAR(MAX)') AS DateValue FROM @XMLString.nodes('/root/s') T(c)) AS Temp  
WHERE DateValue BETWEEN '2014-09-27' AND '2014-09-30'

SELECT STUFF((SELECT ' ' + DateVal AS DateVal FROM #Temp FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 2, '') 
AS ExpectedResult

IF OBJECT_ID(N'tempdb..#Temp', N'U') IS NOT NULL 
DROP TABLE #Temp;
GO

The screen shot

3 个答案:

答案 0 :(得分:0)

试试这个。首先转换dates in string to Rows,然后找到minmax日期

DECLARE @str   VARCHAR(200),
        @cnt   INT=1,
        @inter INT = 17 --length of a single date in the string

SELECT @str = '2014-09-26 19:00 2014-09-27 19:00 2014-09-28 19:00 2014-09-29 19:00 2014-09-29 19:00'

WHILE @cnt <= Len(@str) / 17 - 1
  BEGIN
      SELECT @str = Stuff (@str, @inter, 0, ',')

      SET @inter =17 + @inter + 1
      SET @cnt+=1
  END

PRINT @str

SELECT Min(col) MIN_DATE,
       Max(col) MAX_DATE
FROM  (SELECT CONVERT(DATETIME, Rtrim(Ltrim(Split.a.value('.', 'VARCHAR(100)')))) col
       FROM   (SELECT Cast ('<M>' + Replace(@str, ',', '</M><M>') + '</M>' AS XML) AS Data) AS A
              CROSS APPLY Data.nodes ('/M') AS Split(a)) a 

答案 1 :(得分:0)

需要更长的时间才能找出预期的结果。

我认为您的要求是显示一列字符串,该字符串的日期介于具有日期的字符串列的最小和最大日期之间。

运行以下存储过程并传递日期,最小和最大日期字符串。

CREATE PROCEDURE GetDate (@sString VARCHAR(4000), @MINDate DATETIME, @MaxDate DATETIME)
AS
BEGIN
     DECLARE @SplitChar CHAR(1)
     DECLARE @Count INT
     DECLARE @DateLength INT 
     DECLARE @XMLString XML

     SET @SplitChar = ','
     SET @Count = 1      
     SET @DateLength = 17
     SET @sString = RTRIM(@sString) + ' '

    WHILE @Count <= Len(@sString) / 17 - 1
     BEGIN
          SET @sString = STUFF(@sString, @DateLength, 0, ',')

          SET @DateLength = 17 + @DateLength + 1
          SET @Count = @Count + 1
     END

    --Use XML to extract the Date.
    SET @XMLString = CONVERT(xml,'<root><s>' + REPLACE(@sString,@SplitChar,'</s><s>') + '</s></root>')

    CREATE TABLE #Temp (DateVal VARCHAR(20))

    INSERT INTO #Temp (DateVal)
       SELECT DateValue 
       FROM (SELECT T.c.value('.','VARCHAR(MAX)') AS DateValue FROM @XMLString.nodes('/root/s') T(c)) AS Temp  
       WHERE DateValue BETWEEN @MINDate AND @MaxDate

    SELECT LTRIM((SELECT DateVal AS DateVal FROM #Temp FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)')) 
    AS ExpectedResult
END

执行存储过程。

EXEC GetDate '2014-09-26 19:00 2014-09-27 19:00 2014-09-28 19:00 2014-09-29 19:00', '2014-09-27 19:00', '2014-09-28 19:00'

Param 1 : String of dates.
Param 2 : Min date.
Param 3 : Max date.

ExpectedResult                                     
----------------------------------------------------
2014-09-27 19:00  2014-09-28 19:00   

答案 2 :(得分:0)

 DECLARE @sString VARCHAR(4000)
 DECLARE @MINDate DATETIME 
 DECLARE @MaxDate DATETIME

 SET @sString = '2014-09-26 19:00 2014-09-27 19:00 2014-09-28 19:00 2014-09-29 19:00 2014-09-30 19:00 2014-10-15 19:00 2014-10-16 19:00 2014-10-17 19:00 2014-10-18 19:00 2014-10-19 19:00 2014-10-22 19:00 2014-10-23 19:00 2014-10-24 19:00 2014-10-25 19:00 2014-10-26 19:00 2014-11-11 19:00 2014-11-12 19:00 2014-11-13 19:00 2014-11-14 19:00 2014-11-15 19:00 2014-11-25 19:00 2014-11-26 19:00 2014-11-27 19:00 2014-11-28 19:00 2014-11-29 19:00'
 SET @MINDate = '2014-09-27'
 SET @MaxDate = '2015-09-28'

 EXEC GetDate @sString, @MINDate, @MaxDate

运行并更新结果。