我在sql中有一个月的一周,我需要从那里生成一个日期时间变量..我有的字段是dayofweek,weekofmonth和month值。有谁知道在mssql 2005中计算这个的快速有效方法?感谢
请记住。如果将每周的某周设置为5,那么它就是该月的最后一周
例如我有DayOfWeek,month,year,weekofmonth ..
所以我想说我有DayOfWeek = 2(星期一) 月= 5(可能) 年= 2009年 weekofmonth = 5
我希望在2009年5月25日星期一
DayOfWeek = 1,月= 5,周= 1,年= 2009 = 2009年5月3日星期日
DayOfWeek = 5,Month = 4,Week = 3,Year = 2009 = 2009年4月16日,星期四
其他信息:
我正在使用.net TimezoneInfo.TransitionTime类库来帮助我在数据库中存储一些东西......他们说:
Month属性定义发生时间更改的月份。 Day属性定义转换发生的星期几。 Week属性确定发生时间变化的月份中的哪一周.Week属性的有效值范围为1到5.值5表示该月的最后一周。
到目前为止,我有这个:declare @IsFixedDateRule bit
declare @Day tinyint
declare @DayOfweek tinyint
declare @Week tinyint
declare @Month tinyint
declare @Year int
declare @TimeofDay int -- SECONDS
set @IsFixedDateRule = 0
set @Day = 1
set @DayOfweek = 1
set @Week = 5
set @Month = 4
set @year = 2008
set @TimeofDay = 7200
declare @date datetime
if (@IsFixedDateRule = 1)
begin
set @date = convert(char(4),@Year) + '/' + convert(char(2),@Month) + '/' + convert(char(2),@Day) -- Set Year/Month
end
else
begin
set @date = convert(char(4),@Year) + '/' + convert(char(2),@Month) + '/01' -- Set Year/Month
declare @datepart tinyint
set @datepart = datepart(weekday ,@date)
set @date = dateadd(week, @week - 1, dateadd(weekday, @Dayofweek - case when @datepart = 7 then 0 else @datepart end, @date))-- get the day
end
select dateadd(second, @TimeofDay, @date) -- Add Time Of Day
什么更干净?
答案 0 :(得分:1)
这很简单,实际上只是在那个月的第一天增加了几天和几周。它假设你使用当前年份,并不会真正处理像2月5日这样的事情。 (例如:第2周,2月3日给出03/11/2009)
DECLARE @CalculatedDate DATETIME;
-- Assuming DayOfWeek and WeekOfMonth are 1-based
SELECT @CalculatedDate = DATEADD(DAY, @DayOfWeek - 1, DATEADD(WEEK, @WeekOfMonth - 1, '2009-' + STR(@Month) + '-01'));
-- Assuming DayOfWeek and WeekOfMonth are 0-based
SELECT @CalculatedDate = DATEADD(DAY, @DayOfWeek, DATEADD(WEEK, @WeekOfMonth, '2009-' + STR(@Month) + '-01'))
它还假设DayOfWeek = = 1表示该月的第一天,因此几乎肯定是错误的。我们能看到一些样本数据和预期产出吗?
答案 1 :(得分:0)
五月的第一周从星期五开始。那么什么日期是dayofweek = 1,weekofmonth = 1,month = 5?那是4月27日星期一吗?
答案 2 :(得分:0)
编辑 - 修改为处理@@datefirst
我的猜测基于目前为止的数据。
如果SQL Server安装将@@datefirst
设置为星期日(7)或星期一(1),则此方法将有效。
测试数据设置为返回2009年5月1日
declare @dayofweek int
declare @weekofmonth int
declare @month int
declare @datefirst_adjustment int
select @datefirst_adjustment = case @@datefirst when 1 then 0
when 7 then 1
end
declare @firstofyear datetime
set @firstofyear = '20090101'
set @dayofweek = 5
set @month = 5
set @weekofmonth = 1
select dateadd(ww,@weekofmonth - 1,dateadd(mm,@month - 1,@firstofyear)) - datepart(dw,dateadd(mm,@month - 1,@firstofyear)) + @dayofweek + @datefirst_adjustment
答案 3 :(得分:0)
/*
* Assuming @year is this year
* @day_of_week starts from Sunday = 1, Monday = 2 etc
*/
declare @week_of_month int,
@day_of_week int,
@month int,
@year int,
@derived_date datetime
set dateformat dmy
select @year = datepart(year, getdate()),
@day_of_week = 2,
@week_of_month = 2,
@month = 5
select @derived_date = convert(varchar,@year) + '-01-' + convert(varchar,@month)
select @derived_date
select @derived_date = dateadd(dd, @day_of_week - datepart(dw, @derived_date), dateadd(week, @week_of_month-1, @derived_date))
select @year, @month, @day_of_week, @week_of_month, @derived_date
/* Test */
declare @date datetime
set @date = '04-MAY-2009'
select @date, cast(datename(week,@date) as int)- cast( datename(week,dateadd(dd,1-day(@date),@date)) as int)+1 week_of_month, datepart(dw, @date) day_of_weekhere