【问题标题】:Comparing two dates which are in different time zone比较不同时区的两个日期
【发布时间】:2019-03-12 21:00:39
【问题描述】:

有没有办法比较 SQL Server 2008 R2 中不同时区的两个日期(日期时间数据类型)?

在将 PST 转换为 EST 时,我是否需要担心 DST?看起来总会有 3 小时的差异。

在下面的脚本中,交易日期在 PST 时区,@Date 参数在 EST 时区;

DECLARE @Date DATETIME = '2019/03/09 00:01:57.000'

SELECT  
    f.[CustomerNum] ,
    f.[Amount] ,
    f.[TransactionDate] ,
    cus.Linkdate            
FROM    
    [Transaction] f
INNER JOIN 
    dbo.Customer cus ON cus.CusNum = f.CustomerNum AND cus.OID = f.OID
WHERE   
    f.TransactionDate > @Date

这行得通吗?

DATEADD(MINUTE, DATEPART(TZoffset, SYSDATETIMEOFFSET()), fpn.TransactionDate)> DATEADD(MINUTE, DATEPART(TZoffset, SYSDATETIMEOFFSET()), @Date)

【问题讨论】:

    标签: sql-server sql-server-2008-r2


    【解决方案1】:

    PST 和 EST 之间的偏移量是 3 小时。

    WHERE f.TransactionDate > DATEADD(hour, 3, @Date)  
    

    【讨论】:

    • 这会处理 DST 吗?
    • 夏令时是什么意思?
    • 夏令时(DST)
    • 我明白了,我想我可以为此提出另一个解决方案。
    • 好吧,经过一番研究,用SQL Server 2008处理夏令时似乎很难,有人为此构建了一个特定的功能。很遗憾,我无法为您提供更多帮助。
    【解决方案2】:

    如果您的参数对时区敏感,最好使用明确描述其时区的数据类型,例如datetimeoffset。然后你可以使用switchoffset 更改为你需要的时区。

    DECLARE @Date DATETIMEOFFSET = '2019/03/09 00:01:57.000 -05:00' -- EST
    SELECT  
        f.[CustomerNum] ,
        f.[Amount] ,
        f.[TransactionDate] ,
        cus.Linkdate            
    FROM    
        [Transaction] f
    INNER JOIN 
        dbo.Customer cus ON cus.CusNum = f.CustomerNum AND cus.OID = f.OID
    WHERE   
        f.TransactionDate > cast(switchoffset(@Date,'-08:00') as datetime) -- PST
    

    【讨论】:

    • 在将 PST 转换为 EST 时是否需要担心 DST?看起来总会有 3 小时的差异。
    • 这取决于你如何输入你的transactiondate
    • 交易日期为太平洋标准时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2017-10-23
    相关资源
    最近更新 更多