我有一个表,其中一列(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
答案 0 :(得分:0)
试试这个。首先转换dates in string to Rows
,然后找到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
答案 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
运行并更新结果。