使用星期值设置日期的有效方法

时间:2009-05-12 13:46:30

标签: sql-server sql-server-2005 datetime date

我在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
什么更干净?

4 个答案:

答案 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