获取一天中每个月的日期

时间:2013-10-18 03:43:08

标签: sql sql-server tsql

您好我正在尝试编写一个函数,以便获取日期,例如10/31/2013。从这一天起,它需要31天,而不是从1月开始它给出了12个月的日期列表,即

1/31/2013
2/30/2013
.....
...
12/31/2013

我可以使用

获取日期部分
            declare @day integer 
            set @day=day(GetDate());

我可以使用一段时间来创建每个月。但我想知道是否有更好的方法。请帮忙

2 个答案:

答案 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,以帮助我保持诚实。)