您好我正在尝试编写一个函数,以便获取日期,例如10/31/2013。从这一天起,它需要31天,而不是从1月开始它给出了12个月的日期列表,即
1/31/2013
2/30/2013
.....
...
12/31/2013
我可以使用
获取日期部分 declare @day integer
set @day=day(GetDate());
我可以使用一段时间来创建每个月。但我想知道是否有更好的方法。请帮忙
答案 0 :(得分:2)
declare @d date = '20130615'
select cast(dateadd(m, month, dateadd(year, datediff(year, 0, @d), -1)) as date)
from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) x(month)
@ Kaf评论之后的编辑:好的,我只是假设它是最后一天,它按照我的意图运作,但很可能不像J.Davidson先生所预期的那样。这只会使脚本更容易编写:
select cast(dateadd(m, month - month(@d), @d) as date)
from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) x(month)
答案 1 :(得分:0)
就个人而言,我倾向于更喜欢递归解决方案,尽管@ t-clausen的答案很简单。请注意,考虑到月份长度波动的方式,您不能简单地重复添加一个月(...和2月经常会让所有人失望......)。我想我可能尝试过这样的事情:
WITH Cycle_Dates (startOn, cycleStart, monthsElapsed)
as (SELECT startOn, startOn, 1
FROM Cycle
UNION ALL
SELECT startOn, DATEADD(month, monthsElapsed, startOn), monthsElapsed + 1
FROM Cycle_Dates
WHERE monthsElapsed < 13)
SELECT cycleStart
FROM Cycle_Dates
(我现在认为有必要尽可能发布SQL Fiddle examples,以帮助我保持诚实。)