2009-06-18 160 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

相關問題