Get the date of a given day in a given week
我需要从一年的月份开始,并在一周内的某一天计算出它在一周内的日期。..
即
年份:2009
月:10
周:5
天数:0
将返回 2009-10-25 00:00:00,这是一个星期天。请注意第 5 周,2009-10 的第 5 周没有第 0 天,因为该逻辑周中的星期日是 2009-11-01 00:00:00 ......所以第 5 周将始终返回给定的最后可能的日期给定月份中的一天..
如果你还没有猜到,我正在搞乱 c 结构 TIME_ZONE_INFORMATION(链接文本),如果我公平的话,那真是太疯狂了......
日期数学和 SQL 是值得钦佩的,遗憾的是,除了剥离时间之外,我从未真正深入研究过它。任何帮助将不胜感激。
PS:mssql 2005 顺便说一句..
这是我的实现,它运行良好。它在 SQL 日期时间(1753 年)中找到请求的第一次出现,并计算要添加多少天才能在我们选择的年/月中第一次出现。一旦我们有了它,我们只需对该日期添加 x 周的结果进行案例测试,以确保它始终落在选定的月份内。
这对于那些在 SQL 数据库中考虑过 UTC 日期:时间的人来说非常方便。如果您想绘制"随时间变化的结果",并且该时间跨越几个月,知道日光偏差以及何时开始/结束对于您的查询来说是非常宝贵的信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | Create function dbo.DST_From_MSStandardDate ( @year int, @month int, @week int, @hour int, -- Sun = 1, Mon = 2, Tue = 3, Wed = 4 -- Thu = 5, Fri = 6, Sat = 7 -- Default to Sunday @day int = 1 ) /* Find the first day matching @day in the month-year requested. Then add the number of weeks to a minimum of start of the month and maximum of end of the month */ returns datetime as begin declare @startPoint datetime declare @finalPoint datetime declare @firstDayInMonth datetime declare @begin_week datetime -- Create the base date set @startPoint = dateadd(mm,(@year-1900)* 12 + @month - 1,0) -- Check for valid day of week if @day between 1 and 7 begin -- Find first day on or after 1753/1/1 (-53690) -- matching day of week of @day select @begin_week = convert(datetime,-53690+((@day+5)%7)) -- Verify beginning of week not before 1753/1/1 if @startPoint >= @begin_week begin select @firstDayInMonth = dateadd(dd,(datediff(dd,@begin_week,@startPoint)/7)*7,@begin_week) end end -- Case for an offset, some weeks have 5 weeks, others have 4 weeks. set @finalPoint = dateadd(hour,@hour,dateadd(wk,@week- case when datepart(month,dateadd(wk,@week,@firstDayInMonth))>@month then 1 -- day lands in the following month when datepart(month,dateadd(wk,@week,@firstDayInMonth))<@month then 0 -- day lands in the proceeding month else 0 end ,@firstDayInMonth)) return @finalPoint end go |
你可以使用 T-SQL 存储过程吗?如果是这样,则 DATEPART 将是要使用的函数。
The weekday (dw) datepart returns a
number that corresponds to the day of
the week, for example: Sunday = 1,
Saturday = 7. The number produced by
the weekday datepart depends on the
value set by SET DATEFIRST, which sets
the first day of the week.