1

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

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

我可以通过使用获得白天部分

            declare @day integer 
            set @day=day(GetDate());

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

4

2 回答 2

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)
于 2013-10-18T07:15:04.877 回答
0

就个人而言,我也倾向于使用递归解决方案,尽管@t-clausen 的回答很简单。请注意,考虑到月份长度的波动方式,您不能简单地重复添加一个月(......而且二月经常让所有人失望......)。我想我可能尝试过这样的事情:

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

于 2013-10-18T08:16:12.067 回答