T-sql星期一之前的日期

时间:2009-06-18 13:01:48

标签: tsql

我在大学工作,我们的学生管理系统学年开始日期是在8月1日或之前的星期一确定的。我需要在我的查询中匹配这个,有没有办法轻松获取星期一或在此日期之前的日期。

5 个答案:

答案 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