Почему [дата] + ([время] - [смещение]) недетерминирован в SQL Server 2008? - PullRequest
4 голосов
/ 14 июня 2010

Я пытаюсь сделать следующее для своей таблицы журналов 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 строк, и запрос, если мы не можем выполнить поиск по индексу за полный рабочий день, будет проблематичным.Поскольку это UNION с некоторыми другими форматами журналов, мы не можем легко использовать эти два столбца отдельно.

Ответы [ 2 ]

4 голосов
/ 14 июня 2010

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

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

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

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

0 голосов
/ 14 июня 2010

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

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

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

Дно детерминировано.

...