【问题标题】:Distinguishing between columns with UTC and local datetime区分具有 UTC 和本地日期时间的列
【发布时间】:2016-09-29 11:49:37
【问题描述】:

我正在开发一个将日期时间存储在 SQL Server 数据库中的应用程序。其中一些是存储在 UTC 中的时间点(例如日志项日期时间),而另一些是字面日期/时间(例如“在 7 月 20 日下午 4 点服用 X 药物,与您所在的时区无关)。

问题是它们都具有日期和时间组件,因此使用 datetime2 列类型对两者都有意义。我们现在处于这样一种情况,即在我们的应用程序中,日期/时间列是 UTC 时间点还是字面日期/时间通常是不清楚的。

区分这两种情况的最常见做法是什么?我可以想到这些选项:

1) 以 ...Utc 结束所有 UTC 列,而文字日期/时间列没有特殊结尾。

2) 以 ...Literal 结束所有文字列,而 UTC 日期/时间列没有特殊结尾。

3) 为 UTC 列提供数据类型 datetime2 和文字日期/时间列 datetimeoffset。

【问题讨论】:

  • 你能改变表格并添加一个新列吗?例如。一个标志列 isUTC 显示您是否是 UTC 时间...
  • 我经常看到#1(并且自己使用它)。我还没有看到#2“在野外”。我不建议#3

标签: sql sql-server utc


【解决方案1】:

始终尝试先使用适当的类型,然后再使用良好的命名。如果datetime2(0) 很合适,请使用它。

在我的系统中,我为列名添加了一个后缀,例如:PlaybackStartedLocal datetime2(0)PlaybackStartedUTC datetime2(0)。在我的情况下,我必须为同一事件存储本地值和 UTC 值,因为一些报告需要本地值,一些 UTC 并且以后很难在它们之间进行转换。

一般来说,在列/变量名称中包含计量单位是一种很好的做法。

你喜欢看什么:

PlaybackDurationMSec            or    PlaybackDuration
LengthMeters / LengthMiles      or    Length

一个众所周知的例子,两个程序员团队没有注意到他们将公制值解释为英制,反之亦然:A disaster investigation board reports that NASA’s Mars Climate Orbiter burned up in the Martian atmosphere because engineers failed to convert units from English to metric.

软件计算了推进器需要施加的力 磅的力量。一个单独的软件接收数据 假设它是公制单位:牛顿。

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多