SQL Server SET DATEFIRST scope

qhhrdooz  于 2023-10-15  发布在  SQL Server
关注(0)|答案(4)|浏览(124)

I'm using SS 2005 if that

I've seen sample code like

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

Suppose while the query is running another query sets DATEFIRST?

If another query relies on datefirst being 7 (for example) and doesn't set it, and runs while my query is running, that's his problem for not setting it? or is there a better way to write queries that depend on a given day being day number 1.

xyhw6mcr

xyhw6mcr1#

@@DATEFIRST is local to your session. You can verify it by opening to tabs in Sql Server Management Studio (SSMS). Execute this code in the first tab:

SET DATEFIRST 5

And verify that it doesn't affect the other tab with:

select @@datefirst

See this MSDN article .

g6ll5ycj

g6ll5ycj2#

You can forget about DATEPART(weekday, DateColumn) and @@DATEFIRST and instead calculate the day of the week yourself.

For Monday based weeks (Europe) simplest is:

SELECT DATEDIFF(day, '17530101', ADateTimeColumn) % 7 + 1 AS MondayBasedDay
FROM famousShipwrecks

For Sunday based weeks (America) use:

SELECT DATEDIFF(day, '17530107', ADateTimeColumn) % 7 + 1 AS SundayBasedDay
FROM famousShipwrecks

This works fine ever since January 1st respectively 7th, 1753.

8wigbo56

8wigbo563#

Just an additional point, if you want to avoid setting DATEFIRST you can just incorporate the value of DATEFIRST in your query to find your required day as :

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

Then you dont need to worry about restoring it at all!

vptzau2j

vptzau2j4#

To setup a parameterized first day of the week, the following should work

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

相关问题