2016-10-26 125 views
0

基本上我会在这些多选值传递给我的存储过程的第一和最后一个日期:SQL Server存储过程:返回

'April 2016, May 2016, June 2016, July 2016' 

值可能超过4

就怎么办我使用存储过程返回列表的第一个和最后一个日期?

预期的输出,如:

2016-04-01 
2016-07-31 
+0

你可以把它们放在一个临时表并检索'min'和'max'。你为什么要这样做? – HoneyBadger

+0

您可以使用TABLE VALUED PARAMETER将它们传递 - 然后使用SQL查询表值参数很容易(SQL SERVER 2008及更高版本) – Cato

+0

找到分割函数,然后返回MAX()和MIN()。确保日期格式可以转换为日期,否则你将使用sting比较而不是日期比较 –

回答

0

插入所有行的临时表,找到最小和最大日期为此在你的程序中。如果您以逗号分隔的列表形式传递,请确保将其转换为行。

SELECT CONVERT(DATETIME, 'Apr 2016') date_v 
    INTO #t11 
    UNION ALL 
    SELECT CONVERT(DATETIME, 'may 2016') 
    UNION ALL 
    SELECT CONVERT(DATETIME, 'june 2016') 
    UNION ALL 
    SELECT CONVERT(DATETIME, 'july 2016') 

    SELECT Min(date_v) min_date, 
      Max(date_v) max_date 
    FROM #t11 

更新: 我相信你逝去的是逗号分隔的列表 这种按照以下方法

 DECLARE @TOKENS VARCHAR(MAX)='AUG 2016,APR 2016' 
DECLARE @list XML 

SELECT @list = Cast('<a>' + Replace(@tokens, ',', '</a><a>') 
        + '</a>' AS XML) 

SELECT Ltrim(t.value('.', 'varchar(200)'))AS data 
INTO #tr 
FROM @list.nodes('/a') AS x(t) 

SELECT Min(CONVERT(DATETIME, data)), 
     Max(CONVERT(DATETIME, data)) 
FROM #tr 

更新后与EOMONTH的最大日

declare @tokens varchar(max)='aug 2016,apr 2016' 
declare @list xml 

select @list = cast('<a>' + replace(@tokens, ',', '</a><a>') 
        + '</a>' as xml) 

select ltrim(t.value('.', 'varchar(200)'))as data 
into #tr1 
from @list.nodes('/a') as x(t) 

select min(convert(datetime, data)), 
     eomonth((max(convert(datetime, data)))) 
from #tr1 
+0

这是一个多选字段,所以参数可能超过4 – user3543512

+0

@ user3543512更新后请检查。 – Buddi

+0

你的方法效果很好。但是我的最大日期是2016年8月1日,应该是2016年8月31日 – user3543512

1

尝试这一个 -

1它改变为XML,

2从XML文档读取,

3个改变文本的日期(希望!可能是系统依赖关系)

4选择最小和最大,转换成月的最后一天,在最大

5显示的日期顺序

declare @list nvarchar(max) = 'April 2016, May 2016, June 2016, July 2016'; 

DECLARE @XML nvarchar(max) = '<nub><rec><dat>' + REPLACE(@list, ',', '</dat></rec><rec><dat>') + '</dat></rec></nub>'; 

select @xml; 

DECLARE @iX INT 
EXEC sp_xml_preparedocument @ix output, @xml; 


WITH CTE AS (SELECT CAST('01 ' + dat AS DATETIME) dat_sort ,dat dat FROM OPENXML(@ix, '//rec', 2) 
WITH (dat varchar(50))), 
MIND AS (select MIN(dat_sort) M from cte UNION SELECT dateadd(day, -1,dateadd(month, 1, MAX(dat_sort))) M from cte) 
SELECT M from MIND ORDER BY M 

--this is needed to avoid memory leak 
EXEC sp_xml_removedocument @iX 
+0

不,它可能超过4个。 – user3543512

+0

如果它可以是任何数字 - 你如何通过它们?作为XML例如?或者他们会在一个表或某种类型的字符串? – Cato

+0

你可以使用TABLE VALUED PARAMETER来传递它们 - 然后使用SQL很容易查询表值参数 – Cato