2010-06-14 3 views
4

Je suis en train de faire ce qui suit pour ma table de journaux IIS:Pourquoi est-ce que [date] + ([heure] - [décalage]) est non déterministe dans SQL Server 2008?

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

Cependant, SQL Server 2008 me dit:

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

La table a cette définition:

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

Pourquoi est-ce non déterministe?

J'ai vraiment besoin d'indexer ce champ. La table a actuellement 1598170 lignes, et il est difficile d'interroger si nous ne pouvons pas faire une recherche d'index sur le temps plein. Comme il s'agit d'UNION avec d'autres formats de journaux, nous ne pouvons pas très facilement utiliser les deux colonnes séparément.

+0

Pouvez-vous utiliser 'CONVERT (datetime, '19000101', 112)'? – Gabe

Répondre

4

Votre '1900-01-01' est non-déterministe car elle dépend des paramètres de langue.

Essayez '19000101': SQL Server traite les dates et les heures un peu bizarrement: "aaaa-mm-jj" peut être traité comme "aaaa-jj-mm" si vous avez des paramètres britanniques en dépit d'être ISO en théorie

Edit: utiliser cette option pour supprimer l'aspect Date: DATEADD(day, 0, DATEDIFF(day, 0, [time]))

Edit2: 1 janvier 1900 est égal à zéro dans les formats datetime, donc pas besoin de le soustraire. Pouvez-vous publier des exemples de données et de sortie s'il vous plaît?

+0

Oui, pas besoin de soustraire, en effet. Cela a fait l'affaire. –

0

D'accord, je l'ai compris, grâce à la réponse de @ gbn.

Les trois suivantes sont équivalentes:

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

Le fond est déterministe.

Questions connexes