2010-10-21 3 views
1

Мне было интересно, может ли кто-нибудь помочь мне понять, почему эти два критерия не возвращают одни и те же наборы результатов. Мне кажется странным, что SQL Server 2008 R2 не знал бы использовать смещение при ограничении данных. Есть лучший способ сделать это? Насколько я могу судить, критерий 2 - единственный способ получить правильные данные.Использование критериев DateTimeOffset как WHERE в запросе SQL Server 2008

-- Criteria One 
OriginationDateTimeOffset >= TODATETIMEOFFSET('2010-10-20', '-08:00') AND 
OriginationDateTimeOffset < TODATETIMEOFFSET('2010-10-21', '-08:00') 

-- Criteria Two 
SWITCHOFFSET(OriginationDateTimeOffset, '-08:00') >= TODATETIMEOFFSET('2010-10-20', '-08:00') AND 
SWITCHOFFSET(OriginationDateTimeOffset, '-08:00') < TODATETIMEOFFSET('2010-10-21', '-08:00') 

ответ

1

Зачем ему возвращаться то же самое? В критериях 1 вы сравниваете исходное время со смещением, где в критериях 2 вы меняете смещение на обоих.

+0

Но почему я должен переключаться смещение? У него уже есть привязка к нему, поэтому, на мой взгляд, мне нужно только установить смещение критериев, которые я передаю, и это должно сделать все остальное. Мне кажется, что SQL Server должен переключить все на 0 offset перед выполнением запроса. Зачем мне нужно использовать switchoffset, чтобы поместить смещение в тот же часовой пояс, что и другое смещение. Кажется излишним и ненужным. –

0

TODATETIMEOFFSET преобразует значения (значения) в datetimeoffset. SWITCHOFFSET изменяет значение на другое значение datetimeoffset. Например:

DECLARE @OriginationDateTimeOffset DATETIMEOFFSET = '2010-10-20' 

SELECT @OriginationDateTimeOffset, 
    SWITCHOFFSET(@OriginationDateTimeOffset, '-08:00'), 
    TODATETIMEOFFSET(@OriginationDateTimeOffset, '-08:00') 

производит:

2010-10-20 00:00:00.0000000 +00:00 
2010-10-19 16:00:00.0000000 -08:00 
2010-10-20 00:00:00.0000000 -08:00 
+0

Да, я знаю разницу между ними. Я пытаюсь получить все записи, которые произошли в течение 1 дня PST, поэтому я даю его сегодня и завтра в PST в качестве критериев. Проблема в том, должен ли SQL Server знать, что оба значения, которые он сравнивает, являются DateTimeOffset и конвертируют их в UTC (смещение 0) или что-то в этом роде? Почему я должен убедиться, что они находятся в одном и том же часовом поясе, если информация о часовом поясе связана с обоими частями данных? –

+0

Я согласен - я не понимаю, что использовать этот тип данных вообще. Конечно, не решает ни одной из проблем, с которыми я столкнулся с типом «datetime2», в отношении работы с несколькими часовыми поясами. Исходя из этого, я бы рекомендовал вам сохранить отдельную копию в виде datetime2 без смещения и запросить ее. (Тьфу.) –