周开始日期和周结束日期计算错误

时间:2017-03-12 14:03:29

标签: sql-server tsql

我有一个查询,根据给定的日期计算一周中的第一个和最后一个日期。设置@dDate就足够了,查询将计算该周的第一个(星期一)和最后一个日期(星期日)。

问题是,这是错误的计算,我不明白为什么。

示例:

@dDate = 2019-10-03 (year-month-day).

结果:

W_START      W_END
2019-09-25  2019-10-01

但它应该是:

2019-09-30  2019-10-06

为什么?

查询:

set datefirst 1
declare @dDate date = cast('2019-10-16' as date)
select @dDAte
declare @year int = (select DATEPART(year, @dDAte))
select @year
declare @StartingDate date = cast(('' + cast(@year as nvarchar(4)) + '-01-01') as date)
select @StartingDate


declare @dateWeekEnd date = (select DATEADD(week, (datepart(week, cast(@dDate as date)) - 1), @StartingDate))
declare @dateWeekStart date = dateadd(day, -6, @dateWeekEnd)

select @dateWeekStart W_START, @dateWeekEnd W_END

1 个答案:

答案 0 :(得分:3)

星期几是所以复杂。我发现更容易记住2001-01-01在星期一下降了。

然后,以下日期算术执行您想要的操作:

select dateadd(day,
               7 * (datediff(day, '2001-01-01', @dDate) / 7),
               '2001-01-01'  -- 2001-01-01 fell on a Monday
              )

我承认这是一个警察/黑客攻击。但SQL Server和其他数据库使得这样的日期算法如此繁琐,以至于这样的简单技巧很容易记住。