【发布时间】:2009-05-12 13:46:30
【问题描述】:
我在 sql 中有一个月的一周,我需要从中生成一个日期时间变量。我拥有的字段是 dayofweek、weekofmonth 和月份值。有人知道在 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
有什么更清洁的吗?
【问题讨论】:
-
提供一些例子(多个)。给定 x, y, z, 结果是 g....
-
您能否再发布一些示例(例如,什么是 dayofweek=1、weekofmonth=1、month=5、year=2009)。今年 8 月有 6 周……你的第 5 周是最大值吗?如果是,您将如何表示 8 月 31 日,以使其与 8 月 24 日不同?
-
当然..您的示例将显示 2009 年 5 月 3 日星期日.. 我将编辑我的帖子以包含更多信息
-
如果 dayofweek=1, weekofmonth=1, month=5 是 5 月 3 日,如何表示 5 月 1 日?
-
这个例子只涵盖了没有固定时间表的日期。固定日期处理得更干净。这通常处理像四月的第三个星期三这样的日期。等等。在你的例子中,我们需要做的第一个可能.. 月 = 5 dayofweek = 6 (fri) week = 1 year = 2009
标签: sql-server sql-server-2005 datetime date