2009-05-19 76 views
4

我使用的是2005 SS如果SQL Server的SET DATEFIRST範圍

我見過像

DECLARE @restore = SELECT @@DATEFIRST 
SET DATEFIRST 1 
SELECT datepart(dw,ADateTimeColumn) as MondayBasedDate,.... FROM famousShipwrecks -- 
SET DATEFIRST @restore 

示例代碼假設?

如果另一個查詢依賴於datefirst爲7(例如)並沒有設置它,並且在我的查詢運行時運行,那麼他的問題是沒有設置它?或者是否有更好的方式來編寫查詢,這些查詢取決於指定日期是第1天。

回答

12

@@ DATEFIRST是您的會話的本地會話。您可以通過打開Sql Server Management Studio(SSMS)中的選項卡來驗證它。在第一個選項卡執行此代碼:

SET DATEFIRST 5 

,並驗證它不影響其他標籤:

select @@datefirst 

看到這個MSDN article

+1

所以,如果你正在編寫一個將構成整個會話的存儲過程 - 作爲一個水晶報表的唯一數據源,SP沒有機會改變或重用它 - th en恢復原始值沒有意義嗎? – 2009-05-20 12:56:58

+1

同意,但也許Crystal Reports緩存連接。所以恢復原始值不會有什麼傷害。 – Andomar 2009-05-20 13:05:54

2

只是一個額外的點,如果你想避免設置DATEFIRST你可以納入您的查詢DATEFIRST的值來查找你需要的一天:

SELECT (datepart(dw,ADateTimeColumn) + @@DATEFIRST) % 7) as MondayBasedDate,.... FROM famousShipwrecks -- 

然後你不需要擔心恢復它根本!

0

要設置一週中的參數的第一天,下面應該工作

DECLARE @FirstDayOfWeek INT = 1; 
DECLARE @DateTime DATETIME = '2015-07-14 8:00:00'; 
SELECT (DATEPART(weekday, @DateTime) + @@DateFirst - @FirstDayOfWeek - 1) % 7 + 1; 
0

你可以忘掉DATEPART(weekday, DateColumn)@@DATEFIRST,而是自己計算一週中的一天。

對於基於週一周(歐洲)最簡單的是:

SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay 

對於基於週日周(美國)使用方法:

SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay 

這工作得很好,因爲第7次分別爲1月1日曾經,1753