2

J'ai une table dans SQL Server 2005 avec une clé primaire composite, c'est-à-dire une clé étrangère (INT) et une colonne DateTime.Erreur SQL Server 2005 récupération de l'enregistrement basé sur la colonne de la clé primaire Datetime

Quand je lance le SQL,

Select column1 From TABLE where ForeignKey=1 and DateTime='08/26/2010 11:24:36' 

Aucun enregistrement était de retour quand il y a un tel dossier.

Une option à faire est

Select column1 From TABLE where ForeignKey=1 and DateTime>='08/26/2010 11:24:36' and DateTime<'08/26/2010 11:24:37' 

Mais, il semble juste ... Dois-je vraiment recourir à cela? ou c'est parce que je dois spécifier jusqu'à milliseconde? Ou existe-t-il des solutions?

Aidez-nous s'il vous plaît. Merci d'avance.

+0

Très similaire question et réponse peut être trouvé ici: http://stackoverflow.com/questions/3286849/ – 8kb

+0

10x 8kb .. C'est une question similaire que je n'ai pas réussi à trouver. –

Répondre

2

Oui, vous devez faire correspondre la précision de la valeur DateTime à la milliseconde pour que l'égalité fonctionne.

Votre alternative proposée fonctionnera. Comme une autre idée, vous pouvez utiliser un cast and convert pour tronquer votre datetime stocké à la seconde. Notez cependant que l'utilisation de ces fonctions dans la clause where annulera la capacité de l'optimiseur à utiliser n'importe quel index sur votre colonne datetime. Vous devrez décider quel impact cela aurait sur votre environnement spécifique.

/* CONVERT style 20 is yyyy-mm-dd hh:mi:ss */ 
Select column1 
    From TABLE 
    where ForeignKey=1 
     and CAST(CONVERT(char(19),DateTime,20) as datetime) = '08/26/2010 11:24:36' 

EDIT: Faisant suite aux commentaires ci-dessous, je l'ai remarqué que SQL Server ne semble pas ramasser une différence de 1 milliseconde dans une comparaison. Cela est vrai dans les environnements 2000/2005/2008. Si j'utilise le nouveau type de données datetime2 en 2008, cela fonctionne comme prévu. La lecture sur le datetime type de données, la précision de la partie milliseconde est arrondie:

Précision: Arrondi à des incréments de 0,000, .003 ou .007 secondes

declare @datetime1 datetime 
declare @datetime2 datetime 
declare @datetime3 datetime 
declare @datetime4 datetime 

set @datetime1 = '2010-08-30 08:41:51.513' 
set @datetime2 = '2010-08-30 08:41:51.513' 
set @datetime3 = '2010-08-30 08:41:51.514' 
set @datetime4 = '2010-08-30 08:41:51.515' 

/* Expected result 'Equal'; Actual result 'Equal' */ 
if @datetime1 = @datetime2 
    print 'Equal' 
else 
    print 'Not Equal' 

/* Expected result 'Not Equal'; Actual result 'Equal' */  
if @datetime1 = @datetime3 
    print 'Equal' 
else 
    print 'Not Equal' 

/* Expected result 'Not Equal'; Actual result 'Not Equal' */  
if @datetime1 = @datetime4 
    print 'Equal' 
else 
    print 'Not Equal' 
+0

Existe-t-il un moyen de comparer jusqu'à la milliseconde dans SQL Server 2005 ??? Actuellement, j'ai modifié la structure de la table pour ajouter une colonne Identity Primary Key au lieu d'utiliser ForeignKey avec DateTime composite-primary-key. Cela semble être recommandé. –

+0

Il est intéressant de noter qu'il semble y avoir une perte de précision au niveau de la milliseconde. J'ai ajouté un exemple de code à ma réponse. Une différence de 1 milliseconde n'est pas détectée, mais une différence de 2 millisecondes est. J'ai eu les mêmes résultats sur 2K/2005/2008. –

0

Si, tout possible n'utilisez pas un champ datetime comme clé. Au lieu de cela, créez une clé différente et indexez simplement votre valeur datetime.

Questions connexes