【问题标题】:Why is [date] + ([time] - [offset]) non-deterministic in SQL Server 2008?为什么 [date] + ([time] - [offset]) 在 SQL Server 2008 中是不确定的?
【发布时间】:2010-06-14 12:53:05
【问题描述】:

我正在尝试对我的 IIS 日志表执行以下操作:

ALTER TABLE [W3CLog]
ADD [LogTime] AS [date] + ([time] - '1900-01-01') PERSISTED

但是,SQL Server 2008 告诉我:

表“W3CLog”中的计算列“LogTime”无法持久化,因为该列是不确定的。

表格有这样的定义:

CREATE TABLE [dbo].[W3CLog](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    ...
    [date] [datetime] NULL,
    [time] [datetime] NULL,
    ...
)

为什么这是不确定的?

我真的需要索引那个字段。该表目前有 1598170 行,如果我们不能全时进行索引查找,查询起来很痛苦。由于这是与其他一些日志格式进行联合,因此我们不能很容易地单独使用这两列。

【问题讨论】:

  • 你能用CONVERT(datetime, '19000101', 112)吗?

标签: sql sql-server-2008 deterministic


【解决方案1】:

您的'1900-01-01' 是不确定的,因为它取决于语言设置。当然,这对于 DMY 或 MDY 设置来说是明确的,通常它是不明确的

试试'19000101':SQL Server 对日期和时间的处理有些奇怪:尽管理论上是 ISO,但如果您有英国设置,“yyyy-mm-dd”可以被视为“yyyy-dd-mm”

编辑:使用它来删除日期方面:DATEADD(day, 0, DATEDIFF(day, 0, [time]))

Edit2:1900 年 1 月 1 日在日期时间格式中为零,因此无需减去它。你能发布示例数据和输出吗?

【讨论】:

    【解决方案2】:

    好的,我想通了,感谢@gbn 的回答。

    以下三个是等价的:

    SELECT TOP 100
        [date] + ([time] - '19000101'),
        [date] + ([time] - 0),
        [date] + [time]
    FROM
        dbo.[W3CLog]
    

    底部是确定性的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-08
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      相关资源
      最近更新 更多