使用DateTimeOffset作为SQL Server 2008查询中的WHERE条件

问题描述:

我想知道是否有人能够帮助我理解为什么这两个条件不会返回相同的结果集。对我来说,似乎奇怪的是SQL Server 2008 R2在约束数据时不知道使用偏移量。有一个更好的方法吗?据我所知,标准二是获得正确数据的唯一方法。使用DateTimeOffset作为SQL Server 2008查询中的WHERE条件

-- 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中,您将比较原始时间和偏移量,在标准2中您将更改两者的偏移量。

+0

但是,为什么我应该有切换偏移?它已经有一个与它相关的偏移量,所以在我看来,我只需要设置我传递它的标准的偏移量,剩下的就应该完成。在我看来,像SQL Server应该在执行查询之前将所有内容切换到0偏移量。为什么我需要使用switchoffset将偏移量放入与其他偏移量相同的时区中。似乎多余和不必要的。 – 2010-10-21 23:19:09

TODATETIMEOFFSET将值(s)转换为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中将它作为标准提供给您的原因。问题是,不应该SQL Server知道它比较的两个值是DateTimeOffset的,并将它们转换为UTC(0偏移量)或其自身的性质?如果时区信息与两部分数据相关,为什么我必须确保它们处于同一时区? – 2010-10-21 23:22:16

+0

我同意 - 我不明白什么使用这种数据类型。当然不能解决我使用“datetime2”类型时遇到的任何问题,关于处理多个时区的问题。基于此,我建议您将一个单独的副本存储为不带偏移量的datetime2,然后进行查询。 (呸)。 – 2011-11-21 13:30:46