tags:

views:

481

answers:

2

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.

+1  A: 

@@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.

Andomar
So if you're writing a stored procedure that's going to constitute the entire session - as the one and only data source for a crystal report where there's no chance the SP will ever change or be reused - then there's no point restoring the original value?
Pride Fallon
Agreed, but maybe Crystal Reports caches the connection. So it can't hurt to restore the original value.
Andomar
A: 

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!

Mongus Pong
This does not give a MondayBasedDate, but one where sunday is 1 and monday is 2.To make monday 1 and sunday 7 use the following changes:datepart(WEEKDAY, ADateTimeColumn) + @@DATEFIRST - 2 ) % 7 + 1
Jan Obrestad