基本上我会在这些多选值传递给我的存储过程的第一和最后一个日期:SQL Server存储过程:返回
'April 2016, May 2016, June 2016, July 2016'
值可能超过4
就怎么办我使用存储过程返回列表的第一个和最后一个日期?
预期的输出,如:
2016-04-01
2016-07-31
基本上我会在这些多选值传递给我的存储过程的第一和最后一个日期:SQL Server存储过程:返回
'April 2016, May 2016, June 2016, July 2016'
值可能超过4
就怎么办我使用存储过程返回列表的第一个和最后一个日期?
预期的输出,如:
2016-04-01
2016-07-31
插入所有行的临时表,找到最小和最大日期为此在你的程序中。如果您以逗号分隔的列表形式传递,请确保将其转换为行。
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
这是一个多选字段,所以参数可能超过4 – user3543512
@ user3543512更新后请检查。 – Buddi
你的方法效果很好。但是我的最大日期是2016年8月1日,应该是2016年8月31日 – user3543512
尝试这一个 -
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
不,它可能超过4个。 – user3543512
如果它可以是任何数字 - 你如何通过它们?作为XML例如?或者他们会在一个表或某种类型的字符串? – Cato
你可以使用TABLE VALUED PARAMETER来传递它们 - 然后使用SQL很容易查询表值参数 – Cato
你可以把它们放在一个临时表并检索'min'和'max'。你为什么要这样做? – HoneyBadger
您可以使用TABLE VALUED PARAMETER将它们传递 - 然后使用SQL查询表值参数很容易(SQL SERVER 2008及更高版本) – Cato
找到分割函数,然后返回MAX()和MIN()。确保日期格式可以转换为日期,否则你将使用sting比较而不是日期比较 –