关于sql server 2005:获取给定星期中给定日期的日期

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.