我有一个日期时间值,例如:'2014-10-09 11:09'
。
我想获得两个日期时间值:
2014-10-06
00:00:00
)2014-10-12 23:59:59
)简而言之:我已经给出了一个日期时间值,我需要确定该周的起始和结束时间。
到目前为止,我已经想到了这个:
SET DATEFIRST 1
DECLARE @time DATETIME2(0) = '2014-10-09 11:09';
SELECT
DATEADD(DAY, 0, DATEDIFF(DAY, 0, DATEADD(DAY, 1 - DATEPART(WEEKDAY, @time), @time))),
DATEADD(SECOND, -1, DATEADD(DAY, 0, DATEDIFF(DAY, 0, DATEADD(DAY, 8 - DATEPART(WEEKDAY, @time), @time))))
这可以完成这项任务,但它似乎非常复杂,因为可读性,我需要一个eaiser解决方案。这也是非常快速的,需要数十万行。
你知道任何eaiser解决方案吗?我不希望使用转换来缩短@time
的时间部分。
系统:SQL Server 2012
答案 0 :(得分:3)
DECLARE @TIME DATETIME2(0) = '2014-10-09 11:09';
SELECT DATEADD(WK, DATEDIFF(WK, 0, @TIME), 0) -- FIRST DAY OF WEEK
SELECT DATEADD(SS, 86399, DATEADD(WK, DATEDIFF(WK, 0, @TIME), 0) + 6) -- LAST DAY OF WEEK
答案 1 :(得分:2)
这些表达式将始终生成范围的开始日期和结束日期,如果您乐意切换到建议的替代日期,其中结束日期是独占日期:
select
DATEADD(week,DATEDIFF(day,'19000101',CURRENT_TIMESTAMP)/7,'19000101') as Start,
DATEADD(week,DATEDIFF(day,'19000101',CURRENT_TIMESTAMP)/7,'19000108') as Finish
如果您希望在某个日期和时间找不到当前日期和时间,则可以在两个地方替换CURRENT_TIMESTAMP
{/ p}}。
这可以通过计算自周一"已知的好星期一"以来发生的天数来计算。 (在这种情况下,1900年1月1日是星期一)。然后我们将该天数除以7(忽略余数,如在带有整数除法的SQL Server中自动发生的那样)并将该周数重新添加到相同的"已知的好星期一" - 最终的结果是我们有效地找到了过去最近的星期一。
然后我们再次做同样的伎俩,除非这次我们再添加一些星期,我们实际上将它添加到星期一,发生的时间晚于我们已知的好星期一" - 具有我们实际在未来的下个星期一获得的净效应。