获取给定一周中某一天的日期

时间:2009-10-14 00:26:21

标签: sql-server-2005 tsql

我需要从一个月开始,在一周内的某一天计算出某一周的日期。

年:2009年 月:10 周:5 日数:0

将于2009-10-25 00:00:00返回,这是一个星期天。注意第5周,在2009-10的第5周没有第0天,因为该逻辑周的星期日是2009-11-01 00:00:00 ...所以第5周总是返回给定的最后一个可能的日期在给定月份的一天..

如果你没有猜到我已经搞乱了c struct TIME_ZONE_INFORMATION(link text),如果我很公平的话,那真是太疯狂......

日期数学和SQL是令人钦佩的东西,遗憾的是它是我从未在剥离时间之外深入挖掘的东西。任何帮助都会受到极大关注。

PS:mssql 2005 btw ..

2 个答案:

答案 0 :(得分:1)

这是我的实现,它完美无缺。它在SQL datetime(1753年)中找到所请求日期的第一次出现,并计算在我们选定的年/月中添加到第一次出现的天数。一旦我们有了这个,我们只需要测试在该日期添加x周的结果,以确保它始终在所选月份内着陆。

对于那些考虑过UTC日期的人来说,这非常方便:SQL数据库中的时间。如果你想绘制'结果随时间'的图表,并且知道日光偏差以及开始/结束的时间跨越几个月是您查询的宝贵信息。

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

答案 1 :(得分:0)

您可以使用T-SQL存储过程吗?如果是这样,DATEPART将是要使用的功能。

  

工作日(dw)datepart返回a   对应于当天的数字   一周,例如:星期天= 1,   星期六= 7。产生的数字   工作日的日期部分取决于   由SET DATEFIRST设置的值,设置   一周的第一天。