繁体   English   中英

从一天中获取一年中每个月的日期

[英]Getting a date of each month in a year from a day

嗨,我正在尝试编写一个函数,使其获得日期,例如10/31/2013。 从这一天开始是31天,而不是从一月开始,它给了我12个月的日期列表,即

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

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

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

我可以花点时间为每个月创建。 但是我想知道是否有更好的方法。 请帮忙

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)

就个人而言,尽管@ 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示例 ,以帮助我保持诚实)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM