我有一个查询,根据给定的日期计算一周中的第一个和最后一个日期。设置@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
答案 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和其他数据库使得这样的日期算法如此繁琐,以至于这样的简单技巧很容易记住。