4

J'adore la nouvelle date datatype dans SQL Server 2008, mais quand je compare un champ DATE à un champ DATETIME sur un serveur lié (SQL 2005, dans ce cas), comme ceci:Pourquoi SQL Server ne convertit-il pas automatiquement DATE en DATETIME à des fins de comparaison?

DECLARE @MyDate DATE 
SET @MyDate = CONVERT(DATE, GETDATE()) 

SELECT * 
    FROM MySQL2005LinkedServer.SomeDB.dbo.SomeTable 
WHERE SomeDatetimeField < @MyDate 

Je reçois ce erreur:

OLE DB provider "SQLNCLI10" returned message "Unspecified error". 
OLE DB provider "SQLNCLI10" returned message "The scale is invalid.". 

« l'échelle est non valide » est évidemment parce que le client natif passe le type de données DATE sur le serveur lié, et comme il est SQL 2005, il ne sait pas quoi faire avec elle. L'exécution de cette même requête sur un serveur 2008 fonctionne parfaitement - SQL Server est capable de comparer les types de données DATE et DATETIME sans problème.

Voici ma question - existe-t-il une raison pour laquelle le client natif ne convertit pas automatiquement la valeur DATE de '2009-11-09' en DATETIME du '2009-11-09 00: 00: 00.000' que la version précédente de SQL Server ne s'étouffera pas?

Répondre

4

La structure interne pour datetime (2005) et date/time/datetime2 datetimeoffset (2008) sont très différentes les unes des autres et, comme pour les autres comparaisons, les données doivent être placées dans le même type lors de la comparaison. Donc, le client natif serait obligé de faire une telle conversion. Le client natif peut être généreux et faire la conversion implicite pour vous, mais également l '"élément de moindre surprise" que les produits ont tendance à travailler devrait suggérer que lancer un type à SQL 2005 qu'il ne comprend pas nativement devrait être rejeté. Il y a un certain nombre d'erreurs subtiles qui peuvent glisser de celui-là à coup sûr. Il devrait en être de même pour lancer une datetime2 (7) à SQL 2005, est-ce que nous nous attendons à ce qu'il arrondisse la précision de 100ns aux 3.33ms ou throw and error - je préférerais l'erreur et make/accept un casting explicite.

0

Vous pouvez atteindre cela en utilisant SET SESSION ALTER NLS_DATE_FORMAT = 'JJ/MM/AAAA HH: MI: SS AM'; C'est la solution de temproray, Si vous travaillez sur UNIX alors ces paramètres pourraient être faits de façon permanente dans .profile.

+1

-1. Cette réponse est pour Oracle, lorsque les balises spécifient SQL Server. – devstuff

+0

@Devstuff, je veux juste partager la réponse que je connaissais. Je l'ai trouvé la semaine dernière et est sur ma langue –

1

Je peux seulement deviner que c'est parce que 2009-11-09 00:00:00.000 n'est pas neutre dans le fuseau horaire et serait la cause de bugs plus subtils. Corrigez-moi si j'ai tort, s'il-vous plait.

+0

Semble comme un raisonnement paranoïaque approprié pour moi - mais comme vous, je ne sais pas à coup sûr. –