【问题标题】:sql server culture connectionssql server 文化连接
【发布时间】:2012-01-25 09:50:31
【问题描述】:

我正在寻找一种方法,假设请求来自不同的时区,如何有效地从 sql server 请求数据。

例如来自澳大利亚的请求(UTC/GMT +11 小时)将要求提供早于 2005-11-19 18:00:00 的记录

但服务器在加拿大(UTC/GMT -5 小时),所有记录都保存为加拿大人。

加拿大用户通过 UI 将选择 '2005-11-19 18:00:00' 日期,我们将对 sql server 执行此操作

select * from table1 where added < '2005-11-19 18:00:00'

假设用户通过 UI 选择相同的日期,来自澳大利亚用户的相同选择必须是

select * from table1 where added < '2005-11-19 02:00:00'

我的问题是从不同时区查询 sql server 并在假设时区时得到结果的正确方法是什么。

Effectively Converting dates between UTC and Local (ie. PST) time in SQL 2005 之类的答案不起作用,因为我想通过连接以声明方式执行此操作,并且不想在 sql 中放入任何逻辑。

【问题讨论】:

    标签: sql-server timezone


    【解决方案1】:

    如果你想存储一个时刻,你应该在数据库上使用 UTC(这是最常见的情况,例如用于日志记录等)。

    如果您想存储特定位置的日期,请使用包含其时区信息的日期时间。例如,正确存储包括时间在内的出生日期是必需的(转换为 UTC 可能会改变日期)。

    查询也是如此。通常,用户在查询中输入本地时间,并且需要将其转换为 UTC 以进行查询。但是,如果您查询生日之类的内容,则不希望进行此转换,因为用户不会得到预期的结果。

    所以答案真的是“视情况而定”。最糟糕的是本地时间没有时区信息,因为这通常无法恢复到正确的日期。请注意,夏令时也会影响时区,并且由于规则随时间而变化,即使您知道实际日期和服务器时区(不包括 DST)是什么,您也可能无法正确重建本地日期。

    因此,如果您不需要 SQL 中的逻辑,请在数据库上使用 UTC,并将日期转换为 UTC 以进行插入/更新/查询。

    【讨论】:

      【解决方案2】:

      我的问题是从不同时区查询 sql server 并获得结果的正确方法是什么 假设时区。

      聘请了解问题的程序员并在程序代码中处理它。

      我想通过连接以声明方式进行,不想在sql中放入任何逻辑。

      糟糕的解决方案。是代码问题。

      【讨论】:

      • 您认为在代码中进行所有转换是完全正确的方法吗?我发现这种方式非常手动,并认为可能有更智能/自动化的方式。
      • 嗯,手册是相对的。我发现它最灵活。我将所有时间戳以 UTC 格式存储在服务器上并处理本地化 - 这可能会根据需要更改。
      猜你喜欢
      • 2018-03-24
      • 2018-12-27
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-24
      • 2015-01-14
      • 2016-11-22
      • 2011-08-08
      相关资源
      最近更新 更多