web-dev-qa-db-fra.com

L'instruction Datetime BETWEEN ne fonctionne pas dans SQL Server

J'ai la requête suivante,

SELECT * FROM LOGS 
WHERE CHECK_IN BETWEEN CONVERT(datetime,'2013-10-17') AND CONVERT(datetime,'2013-10-18')

cette requête ne renvoie aucun résultat, mais la requête suivante renvoie le résultat,

SELECT * FROM LOGS WHERE CHECK_IN >= CONVERT(datetime,'2013-10-17')

pourquoi la première requête ne renvoie aucun résultat? Si j'ai commis une erreur, veuillez me corriger.

9
Able Alias

Avez-vous des moments associés à vos dates? BETWEEN est inclusif, mais lorsque vous convertissez 2013-10-18 à une date, celle-ci devient 2013-10-18 00: 00: 000.00. Tout ce qui est enregistré après la première seconde du 18 ne sera pas affiché en utilisant BETWEEN, sauf si vous incluez une valeur temporelle.

Essayer:

SELECT * FROM LOGS WHERE CHECK_IN BETWEEN CONVERT(datetime,'2013-10-17') AND CONVERT(datetime,'2013-10-18 23:59:59:999')

si vous voulez chercher toute la journée du 18.

Les champs SQL DATETIME ont des millisecondes. J'ai donc ajouté 999 au champ.

34
Skerkles

La deuxième requête renvoie-t-elle des résultats à partir du 17 ou juste du 18?

La première requête ne renverra que les résultats du 17 ou du 18 à minuit.

Essayez ceci à la place

select * 
from LOGS 
where check_in >= CONVERT(datetime,'2013-10-17') 
and check_in< CONVERT(datetime,'2013-10-19')
5
podiluska

Vous ne rencontrez aucune erreur dans vos requêtes . Je suppose que ceci est le suivant:

  • Aucun enregistrement n'existe entre 2013-10-17 'et' 2013-10-18 '
  • les enregistrements renvoyés par la deuxième requête vous existez après «2013-10-18»
2
apomene

Vous devez convertir le champ de date en varchar pour supprimer l’heure, puis le reconvertir en date-heure. L’heure sera réinitialisée à «00: 00: 00.000».

SELECT *
FROM [TableName]
WHERE
    (
        convert(datetime,convert(varchar,GETDATE(),1)) 

        between 

        convert(datetime,convert(varchar,[StartDate],1)) 

        and  

        convert(datetime,convert(varchar,[EndDate],1))
    )
0
NetIntel

A partir de SQL Server 2008, vous avez le format "date". 

Afin que vous puissiez utiliser 

SELECT * FROM LOGS WHERE CONVERT(date,[CHECK_IN]) BETWEEN '2013-10-18' AND '2013-10-18'

https://docs.Microsoft.com/en-us/sql/t-sql/data-types/date-transact-sql

0
maurox