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

在SQL Server 2008查询中使用DateTimeOffset作为WHERE条件,sql,sql-server-2008,criteria,where,datetimeoffset,Sql,Sql Server 2008,Criteria,Where,Datetimeoffset,我想知道是否有人能帮助我理解为什么这两个标准不返回相同的结果集。对我来说,SQL Server 2008 R2在约束数据时不知道如何使用偏移量,这似乎很奇怪。有更好的方法吗?据我所知,标准二是获得正确数据的唯一途径 -- Criteria One OriginationDateTimeOffset >= TODATETIMEOFFSET('2010-10-20', '-08:00') AND OriginationDateTimeOffset < TODATETIMEOFFSET('

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

-- 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')
——标准一
OriginationDateTimeOffset>=TODATETIMEOFFSET('2010-10-20','-08:00')和
OriginationDateTimeOffset=TODATETIMEOFFSET('2010-10-20','-08:00')和
SWITCHOFFSET(OriginationDateTimeOffset,'-08:00')
为什么它会返回相同的值?在条件1中,您将原始时间与偏移量进行比较,而在条件2中,您将更改两者的偏移量。

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

但我为什么要切换偏移量呢?它已经有了一个与之相关的偏移量,所以在我看来,我只需要设置我通过它的标准的偏移量,它就应该完成其余的工作。在我看来,SQL Server应该在执行查询之前将所有内容切换到0偏移量。为什么我需要使用switchoffset将该偏移与另一个偏移放在同一时区中。似乎是多余和不必要的。是的,我知道这两者之间的区别。我正在尝试获取PST日内发生的所有记录,这就是为什么我将今天和明天的PST作为标准。问题是,SQL Server是否应该知道其比较的两个值都是DateTimeOffset,并自行将它们转换为UTC(0偏移量)或类似的值?如果两个数据都有时区信息,为什么我必须确保它们在同一个时区?我同意-我根本不理解这个数据类型的用途。当然,这并不能解决“datetime2”类型在处理多个时区时遇到的任何问题。基于此,我建议您将一个单独的副本存储为不带偏移量的datetime2,并查询它。(恶心。)