Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何通过解析列值来获取结果表?_Sql Server - Fatal编程技术网

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

Sql server 如何通过解析列值来获取结果表?,sql-server,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 dateItem>=minDate和dateItem试试这个。首先将字符串中

我有一个表,其中一列(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

dateItem>=minDate和dateItem试试这个。首先将字符串中的
日期转换为行
,然后查找
min
max
日期

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 
DECLARE@str VARCHAR(200),
@cnt INT=1,
@inter INT=17——字符串中单个日期的长度

选择@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'
而@cnt则需要更长的时间才能得出预期的结果

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

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

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

运行并更新结果。

将日期以逗号分隔并填充为表格,使用日期范围筛选该表格,然后重新填充为以逗号分隔的单列。我不能使用逗号分隔的方法。我应该按原样使用。日期列表字符串是时间线吗?我是说左边的日期总是比右边的日期小吗?@CiucaS:是的。但是,并不是只有时间轴值。有些日期作为时间线,但也可能是单个日期。我尝试将您的代码作为普通查询(而不是存储过程)并按以下方式填写sString:从T_Action中选择sString=DateList,其中ID=44404,也就是说,我使用了包含真实数据的表。但是,我得到了ExpectedResult=NULL。当我打印DateList列(print sString)的内容时,所有的日期都是一个接一个的,而不是一长串的日期。也许这就是问题所在?在ID=44404的T_操作中发布SELECT sString=DateList的内容。查询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:00 2014-10-22 19:00 2014-10-23 19:00 2014-10-24 19:00 2014-10-10-25 19:00 2014-10-26 19:00 2014-11-11-12 19:00 2014-11-14:002014-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但是,正如我所说,在MS SQL Server Management Studio中它看起来不同。所有日期都是一个接一个的。请看一下我在顶部原始帖子中使用的代码。有一个错误:Msg 241,级别16,状态1,过程GetDate,从字符串转换日期和/或时间时,第27行转换失败。我通过以下方式获得了字符串:SELECT sString=DateList from T_Action,其中ID=44404是指上述查询在不使用SELECT sString=DateList from T_Action,其中ID=44404的情况下工作。您是否更改了SP。除了:SET@sString=…,一切都是一样的,因为我使用数据库表中的真实数据。如果我使用您的测试代码,则结果日期之间有2个空格。如何使它成为一个空间?
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   
 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