Sql server 如何通过解析列值来获取结果表?
我有一个表,其中一列(DateList,varchar(4000))包含作为字符串的日期时间值列表。情况如下: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试试这个。首先将字符串中
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