Почему [дата] + ([время] - [смещение]) недетерминировано в SQL Server 2008?

Я пытаюсь сделать следующее для моей таблицы журналов IIS:

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

Однако SQL Server 2008 говорит мне:

Computed column 'LogTime' in table 'W3CLog' cannot be persisted because the column is non-deterministic.

В таблице есть такое определение:

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

Почему это недетерминировано?

Мне действительно нужно проиндексировать это поле. В настоящее время в таблице 1598170 строк, и очень сложно выполнять запросы, если мы не можем постоянно выполнять поиск по индексу. Поскольку это объединяется с некоторыми другими форматами журнала, мы не можем просто использовать два столбца по отдельности.


person John Gietzen    schedule 14.06.2010    source источник
comment
Вы можете использовать CONVERT(datetime, '19000101', 112)?   -  person Gabe    schedule 14.06.2010


Ответы (2)


Ваш '1900-01-01' не является детерминированным, поскольку зависит от языковых настроек. конечно, это однозначно для настроек DMY или MDY, но вообще это неоднозначно

Попробуйте '19000101': SQL Server обрабатывает даты и время несколько странно: «гггг-мм-дд» можно рассматривать как «гггг-дд-мм», если у вас британские настройки, несмотря на то, что теоретически это ISO.

Изменить: используйте это, чтобы удалить аспект даты: DATEADD(day, 0, DATEDIFF(day, 0, [time]))

Edit2: 1 января 1900 года равно нулю в форматах даты и времени, поэтому его не нужно вычитать. Можете ли вы опубликовать образцы данных и вывод, пожалуйста?

person gbn    schedule 14.06.2010

Хорошо, я понял это благодаря ответу @gbn.

Следующие три эквивалентны:

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

Нижняя часть детерминирована.

person John Gietzen    schedule 14.06.2010