2010-05-19 7 views
3

J'ai un «bug» assez bizarre avec une requête simple, et je me souviens vaguement en avoir lu la raison quelque part il y a longtemps, mais j'aimerais que quelqu'un me rafraîchisse la mémoire.Requête T-SQL avec plage de dates

La table est un ID de base, table Datetime.

La requête est:

select ID, Datetime from Table where Datetime <= '2010-03-31 23:59:59' 

Le problème est que les résultats de la requête incluent les résultats où le DATETIME '2010-04-01 00:00:00'. Le jour suivant. Ce qui ne devrait pas.

Quelqu'un?

Vive

Moo

Répondre

6

Jetez un oeil à How Are Dates Stored In SQL Server? et How Does Between Work With Dates In SQL Server?

Si c'est un smalldatetime il a 1 minute de précision si Arrondit, pour datetime il est 300 miliseconds

exemple

DECLARE @d DATETIME 
SELECT @d = '2001-12-31 23:59:59.999' 

SELECT @d 

2002- 01-01 00: 00: 00.000

DECLARE @d DATETIME 
SELECT @d = '2001-12-31 23:59:59.998' 

SELECT @d 

2001-1 2-31 23:59:59.997

Toujours utiliser moins de lendemain à minuit, dans votre cas

< '20100401' 
+0

+1 pour expliquer ce qui se passe vraiment, et non une simple liste l'un des contournements. –

+0

Merci pour l'explication, cela correspond à ce dont je me souviens - cependant, je viens de réaliser quelque chose de mon expérience de l'autre jour qui ne correspond pas vraiment à l'un ou l'autre de vos exemples. Dans mon cas, 2010-04-01 était inclus pour les valeurs de temps de 23:59:59 jusqu'à 23:59:30. 23:59:29 exclu le jour errant du jeu de résultats. Des idées? – Moo

+0

Peu importe, cela a du sens. À votre santé! – Moo

3

Il est très étrange que vous voyez que; Je ne sais pas pourquoi. Mais je suggère que vous écrivez la requête ainsi à la place:

select ID, Datetime from Table where Datetime < '2010-04-01' 
3

essayer de le faire comme:

select ID, Datetime from Table where Datetime < '2010-04-01' 

J'ai toujours étage datetime et incrémenter le jour et il suffit d'utiliser « < » moins.

au sol un datetime juste l'utilisation du jour:

SELECT DATEADD(day,DATEDIFF(day,0, GETDATE() ),0) 

vous pouvez facilement incrémenter un datetime en utilisant plus:

SELECT GETDATE()+1 

en utilisant le '23: 59: 59' vous pouvez manquer des lignes, essayer:

DECLARE @YourTable table (RowID int, DateOf datetime) 
INSERT INTO @YourTable VALUES (1,'2010-03-31 10:00') 
INSERT INTO @YourTable VALUES (2,'2010-03-31') 
INSERT INTO @YourTable VALUES (3,'2010-03-31 23:59:59') 
INSERT INTO @YourTable VALUES (4,'2010-03-31 23:59:59.887') 
INSERT INTO @YourTable VALUES (5,'2010-04-01') 
INSERT INTO @YourTable VALUES (6,'2010-04-01 10:00') 
select * from @YourTable where DateOf <= '2010-03-31 23:59:59' 

SORTIE

RowID  DateOf 
----------- ----------------------- 
1   2010-03-31 10:00:00.000 
2   2010-03-31 00:00:00.000 
3   2010-03-31 23:59:59.000 

(3 row(s) affected 

cette requête est erronée, car elle ne trouve pas l'enregistrement rowID = 4 manqué.

si vous essayez de résoudre ce problème avec:

select * from @YourTable where DateOf <= '2010-03-31 23:59:59.999' 

alors RowID = 5 seront inclus aussi bien, ce qui est faux.