【问题标题】:Using DateTimeOffset as WHERE criteria in a SQL Server 2008 query在 SQL Server 2008 查询中使用 DateTimeOffset 作为 WHERE 条件
【发布时间】:2010-10-21 22:49:21
【问题描述】:

我想知道是否有人可以帮助我理解为什么这两个标准不返回相同的结果集。对我来说,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')

【问题讨论】:

    标签: sql sql-server-2008 criteria where datetimeoffset


    【解决方案1】:

    为什么会返回相同的结果?在标准 1 中,您将原始时间与偏移量进行比较,而在标准 2 中,您将更改两者的偏移量。

    【讨论】:

    • 但我为什么要切换偏移量?它已经有一个与之相关的偏移量,所以在我看来,我应该只需要设置我通过它的标准的偏移量,剩下的就可以了。在我看来,SQL Server 应该在执行查询之前将所有内容都切换为 0 偏移量。为什么我需要使用 switchoffset 将偏移量放入与其他偏移量相同的时区。似乎是多余和不必要的。
    【解决方案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
    

    【讨论】:

    • 是的,我知道这些之间的区别。我试图获取在太平洋标准时间 1 天内发生的所有记录,这就是为什么我今天和明天在太平洋标准时间给出它作为标准。问题是,SQL Server 不应该知道它比较的两个值都是 DateTimeOffset 的,并将它们转换为 UTC(0 偏移量)或它自己的东西吗?如果时区信息与两条数据相关联,为什么我必须确保它们处于同一时区?
    • 我同意 - 我根本不明白这个数据类型有什么用。在处理多个时区方面,当然不能解决我在使用“datetime2”类型时遇到的任何问题。基于此,我建议您将单独的副本存储为不带偏移量的 datetime2,然后进行查询。 (糟糕。)
    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多