4

我正在尝试为我的 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 行,如果我们不能全时进行索引查找,查询起来很痛苦。由于这是与其他一些日志格式联合的,我们不能很容易地单独使用这两列。

4

2 回答 2

4

'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 日在日期时间格式中为零,因此无需减去它。您可以发布示例数据和输出吗?

于 2010-06-14T12:56:24.100 回答
0

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

以下三个是等价的:

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

底部是确定性的。

于 2010-06-14T13:00:15.997 回答