2009-05-19 3 views
4

Я использую SS 2005, если этотSQL Server SET DATEFIRST сфера

Я видел образец кода, как

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

Предположим, запрос выполняется другой запрос устанавливает DATEFIRST?

Если другой запрос основан на datefirst 7 (например) и не устанавливает его и запускается во время выполнения моего запроса, это его проблема в том, что он не устанавливает его? или есть лучший способ писать запросы, которые зависят от данного дня, являющегося днем ​​дня.

ответ

12

@@ DATEFIRST является локальным для вашей сессии. Вы можете проверить его, открыв вкладки в Sql Server Management Studio (SSMS). Выполнить этот код на первой вкладке:

SET DATEFIRST 5 

И убедитесь, что он не влияет на вкладку другой с:

select @@datefirst 

Смотрите эту MSDN article.

+1

Итак, если вы пишете хранимую процедуру, которая будет составлять весь сеанс, - как единственный источник данных для кристального отчета, где нет шансов, что SP когда-либо изменится или будет повторно использоваться ru нет смысла восстанавливать исходное значение? –

+1

Согласовано, но, возможно, Crystal Reports кэширует соединение. Поэтому восстановить исходное значение не удастся. – Andomar

2

Просто дополнительный пункт, если вы хотите, чтобы избежать установки DATEFIRST вы можете просто включить значение DATEFIRST в запросе, чтобы найти свой необходимый день, как:

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

Тогда вам не нужно беспокоиться о восстановлении его вообще!

+5

Это не дает MondayBasedDate, но тот, где воскресенье равно 1 и понедельник равно 2. Для того, чтобы Понедельник 1 и воскресенье 7 использовать следующие изменения: DATEPART (будний день, ADateTimeColumn) + @@ DATEFIRST - 2)% 7 + 1 –

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 

Это прекрасно работает с тех пор 1 января соответственно 7, 1753.