2011-08-31 69 views
3

我用這個SQL得到一週的開始日(星期一),當用戶輸入的其他日子日期問題得到一週的開始日(星期一)

@StartDate具有格式(年月日)

SQL:CAST(convert(varchar(12),DATEADD(week,DATEDIFF(week,0,@StartDate),0),112) as int

的問題是,當輸入的日期爲週二至週六,它返回到當前周的週一正確。然而,當輸入的日期是星期日時,它會在下週的星期一返回日期。

有誰能夠告訴我,我做錯了什麼
謝謝

+0

你爲什麼要把你的日期時間存儲爲一個整數?的[獲取在SQL Server一週的第一天] –

+0

可能重複(http://stackoverflow.com/questions/7168874/get-first-day-of-week-in-sql-server) –

+0

@MartinSmith我們有很多有關如何獲得本週第一天的問題,但您鏈接到的那一天不適用於查找第一天。你可以在這裏測試我要求:設置DATEFIRST 7; SELECT [start_of_week] = DATEADD(WEEK,DATEDIFF(WEEK, '1900-01-01',CURRENT_TIMESTAMP-3), '1900-01-01'); –

回答

4

您週日屬於同一週週一,這將使週一的一週的第一天。它應該解決您的查詢

set datefirst 1 

這句法不關心什麼日子數據庫正在考慮周的第一天,它會計算你的@StartDate的實際周的星期一。

DATEADD(week, DATEDIFF(day, 0, @StartDate)/7, 0) 

你可以用這個測試:

SELECT DATEADD(week, DATEDIFF(day, 0, getdate())/7, 0) 
1

這工作:

SELECT DATEPART(weekday, DATEADD(day, -1, CONVERT(DATETIME, @StartDate))) 

另外,不要忘記先設置正確的日期格式:

SET DATEFORMAT ymd 
1

你知道我是怎麼做到的?

SELECT max(cal_date) 
FROM calendar 
WHERE cal_date <= CURRENT_DATE 
    AND day_of_week = 'Mon' 

沒有算術。快速,在我的舊箱子上運行.000082秒。日曆表是索引的;它可以有效地用於連接巨大的表格。

還有最重要的 - 你可以告訴查詢顯然是正確的。

+0

並非所有數據庫都有一個名爲calendar的用戶定義表。 –

+1

@ t-clausen.dk但更多的數據庫*應該*有一個日曆表。 –

相關問題