在SQL中的特定日期获取星期一00:00和星期日23:59

时间:2014-10-09 09:20:19

标签: sql-server tsql

我有一个日期时间值,例如:'2014-10-09 11:09'

我想获得两个日期时间值:

  • 该周的星期一日期00:00:00(2014-10-06 00:00:00
  • 那个星期天的星期日,时间是23:59:59 (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

2 个答案:

答案 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中自动发生的那样)并将该周数重新添加到相同的"已知的好星期一" - 最终的结果是我们有效地找到了过去最近的星期一。

然后我们再次做同样的伎俩,除非这次我们再添加一些星期,我们实际上将它添加到星期一,发生的时间晚于我们已知的好星期一" - 具有我们实际在未来的下个星期一获得的净效应。