我在大学工作,我们的学生管理系统学年开始日期是在8月1日或之前的星期一确定的。我需要在我的查询中匹配这个,有没有办法轻松获取星期一或在此日期之前的日期。
答案 0 :(得分:6)
接受的答案对我不起作用,因为我在同一个查询中需要周日周和周一周。这适用于不同的“datefirst”设置:
SELECT DATEADD(d, -((DATEPART(WEEKDAY, '20110515') - DATEPART(dw, '19000101') + 7) % 7), '20110515')
“DATEPART(dw,'19000101')”将确定自1900-01-01星期一以来的“datefirst”设置。如果您想要以星期二为基础的一周,则可以将19000101更改为19000102.
BTW,'20110515'是唯一适用于所有SQL Server文化设置的日期格式。 “2011-05-06”等日期在某些国家/地区会被误解。 (感谢Itzik Ben-Gan指出这一点)
答案 1 :(得分:3)
set datefirst 1; -- Make Monday the first day of the week
select dateadd(dd, -1*(datepart(dw, '2009-08-01')-1), '2009-08-01')
返回2009年7月27日,即8月1日或之前的星期一。将其更改为2005年8月1日星期一,查询将返回08-01
答案 2 :(得分:1)
你可以使用datepart获取工作日,然后做一些数学运算回到你的星期一。此示例使用美国默认的datefirst 7(其中星期一是一周的第2天)。将要添加的天数调整为星期一的哪一天适用于您的语言区域。
select dateadd(dd, -datepart(dw, '2009-08-01') + 2, '2009-08-01')
答案 3 :(得分:0)
非常hacky
DECLARE @weekday int
SELECT @weekday = DATEPART(WEEKDAY, '1-Aug-2009')
SELECT CASE
WHEN @weekday = 1 THEN '1-Aug-2009' ELSE DATEADD ( dd,(@weekday-2)*-1, '1-Aug-2009')
END
答案 4 :(得分:0)
这是一种通用算法,将返回任何月份的第一个星期一(@inputdate):
DATEADD(wk, DATEDIFF(wk, 0, dateadd(dd, 6 - datepart(day, @inputDate), @inputDate)), 0)
这是在SQL Server中获取当月第一个星期一的常用方法。这个link解释了上述计算如何与许多其他日期计算一起使用。
以下是上述算法如何用于在一个月的第一天或之前获得星期一:
-- Set month to get Monday before or at 1st of month.
DECLARE @inputDate DATETIME
SET @inputDate = '2009-08-01'
-- Get first Monday of month.
DECLARE @firstMonday DATETIME
SET @firstMonday = DATEADD(wk, DATEDIFF(wk, 0, dateadd(dd, 6 - datepart(day, @inputDate), @inputDate)), 0)
-- Determine date for first Monday on or before 1st of month.
DECLARE @startDate DATETIME
SET @startDate = @firstMonday
IF @firstMonday > @inputDate
SET @startDate = DATEADD(wk, -1, @firstMonday)
SELECT @startDate