2009-06-18 81 views
5

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

回答

2
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

1

你可以使用datepart来获得周日,然后做一点数学来回到你的星期一。此示例使用美国默认的datefirst 7(其中星期一是本周的第2天)。调整要添加的日期,以星期一的哪一天为您的区域设置。

select dateadd(dd, -datepart(dw, '2009-08-01') + 2, '2009-08-01') 
+0

我标记下来,因为以下返回一个不正确的结果:select dateadd(dd,-datepart(dw,'2011-05-15')+ 2,'2011 -05-15' )。这返回'2011-05-16'。 – 2011-05-19 21:27:40

0

非常哈克

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 
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 
4

接受的答案并没有为我工作,因为我需要一个都周日周和周一周在同一个查询中。这可以跨越不同的 “DATEFIRST” 设置:

SELECT DATEADD(d, -((DATEPART(WEEKDAY, '20110515') - DATEPART(dw, '19000101') + 7) % 7), '20110515') 

“DATEPART(DW, '19000101')”,将决定你的 “DATEFIRST” 自1900-01-01设置是在星期一。如果您想要以星期二为基础的星期,则可以将19000101更改为19000102.

顺便说一下,'20110515'是唯一适用于所有SQL Server文化设置的日期格式。像“2011-05-06”这样的日期在某些国家会被误解。 (赞成Itzik本甘指出这一点)

+0

+1,用于优雅的'datefirst'不可知解决方案。 – 2012-01-24 19:42:22

+0

不错,应该是被接受的答案 – nhaberl 2016-04-12 09:27:16