我需要从一个月开始,在一周内的某一天计算出某一周的日期。
即
年: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 ..
答案 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设置的值,设置 一周的第一天。