2016-11-24 3 views
2

Après-midi,Mois renvoie une valeur incorrecte à partir de la date

J'ai un problème avec un serveur SQL que je pourrais faire avec de l'aide. Lorsque j'exécute une instruction select avec une plage de dates dans la zone où elle renvoie des lignes de la plage de dates incorrecte.

par exemple. Si j'exécute ce qui suit

select * from theTable where startDate between '2016-09-01 00:00:00' and '2016-09-08 23:59:59' 

j'attendre les lignes où la startDate se situe entre le 1er et le 8 Septembre, ce que je veux réellement est des lignes avec un startDate entre le 9 Janvier et Août 9.

J'ai vérifié la langue que j'ai installé sur le datebase en utilisant:

select * from sys.syslanguages order by name where name = @@language 

Ce retour britannique

retours UserOptions DBCC

textsize    2147483647 
language    British 
dateformat   dmy 
datefirst   1 
lock_timeout   -1 
quoted_identifier SET 
arithabort   SET 
ansi_null_dflt_on SET 
ansi_warnings  SET 
ansi_padding   SET 
ansi_nulls   SET 
concat_null_yields_null SET 
isolation level   read committed 

J'ai vérifié la langue par défaut pour la connectez-vous et c'est aussi britannique.

Lorsque j'exécute print month('2016-09-01 00:00:00')

Il retourne 1 et non 9. À moins que je ne me trompe la date et l'heure ci-dessus devraient être ODBC yyyy-mm-dd hh:mi:ss(24h) canonique.

Pourquoi est-ce qu'il imprime 1 au lieu de 9 et, plus important encore, comment le corriger?

impression @@version retourne

Microsoft SQL Server 2005 - 9.00.5057.00 (X64) 
    Mar 25 2011 13:33:31 
    Copyright (c) 1988-2005 Microsoft Corporation 
    Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2) 

Merci pour votre aide. Si cela a déjà été répondu pouvez-vous me pointer dessus, seulement je ne peux pas trouver la réponse.

+2

Utilisez un format non ambigu ('YYYYMMDD'): 'où startDate> =' 20160901 'et startDate <' 20160909'' – Lamak

Répondre

2

Vous semblez avoir un paramètre d'internationalisation relativement inhabituel, où la valeur par défaut est YDM plutôt que YMD.

Vous pouvez toujours utiliser les dates sans traits d'union:

select * 
from theTable 
where startDate >= '20160901' and 
     startDate < '20160909'; 

Ce sont toujours interprété comme AAAAMMJJ dans SQL Server.

+0

En effet. Le cadre en français, pour choisir un exemple commun, interprétera «2016-09-01 00:00:00» comme étant le 9 janvier 2016. –

-1

Si vous voulez horodatage à considérer également tout en évaluant votre condition where, essayez de convertir vos dates:

CONVERT(datetime,'2016-09-01 00:00:00',101) 

vous demande serait donc devenu:

select * from theTable 
where startDate between 
CONVERT(datetime,'2016-09-01 00:00:00',101) 
and 
CONVERT(datetime,'2016-09-08 23:59:59',101) 

De cette façon, votre mois serait [9] au lieu de [1] et l'horodatage serait également considéré.