DateTime en SQL uniquement en comparant l'heure

ID DateTime Code ---------- -------------- ---------- 58 2015-01-01 20:00:00 1111 58 2015-01-11 10:00:00 8523 58 2015-01-11 03:00:00 4555 58 2015-01-19 00:01:00 8888 9 2015-01-01 20:00:00 4444 

Comment puis-je countr le nombre de codes pour un ID spécifique en ignorant la date à laquelle il est, mais il doit être entre 20:00:00 et 06:00:00

 select count(code) as count from table 1 where ID='58' and DateTime between '20:00:00' and '06:00:00' 

la production attendue serait

countr

3

 SELECT count(code) as count FROM table1 WHERE ID='58' and (CAST(DateTime as time) >= '20:00' or CAST(DateTime as time) <= '06:00') 

EDIT: John, je comprends le problème. Voici une solution complète pour gérer ces cas:

Pour utiliser des variables:

 DECLARE @HourBegin time = '07:00' DECLARE @HourEnd time = '17:30' SELECT count(code) as count FROM table1 WHERE ID='58' and (CAST(DateTime as time) between @HourBegin and @HourEnd or ((CAST(DateTime as time) <= @HourEnd or CAST(DateTime as time) >= @HourBegin) and @HourBegin > @HourEnd) ) 

Presque le même que la réponse précédente, mais avec des heures, il semble plus agréable pour moi et pourrait être vous besoin de code DISTINCT

 SELECT count(DISTINCT code) as count FROM table1 WHERE ID='58' and (DATEPART(HOUR,DateTime) >= 20 or DATEPART(HOUR,DateTime) < 6) 

MISE À JOUR: changé de <= 6 à <6

Mettre à jour

Cette réponse s'applique à MySQL .
Quand j'ai commencé à écrire la réponse, la question a été étiquetée mysql et sql-server . L'OP l'a édité en attendant.


Cette requête devrait faire ce que vous voulez sur MySQL .

 SELECT count(code) AS `count` FROM `table 1` WHERE ID='58' AND TIME(`DateTime`) NOT BETWEEN '06:00:01' AND '19:59:59' 

La fonction MySQL TIME() extrait uniquement le composant time d'une valeur DATETIME .

Sur la version 5.7, MySQL a ajouté le support pour les secondes fractionnaires (jusqu'à 6 numbers) sur les colonnes DATETIME . La requête ci-dessus inclura les inputs ayant un time supérieur à 06:00:00 mais inférieur à 06:00:01 (events qui se sont produits pendant la première seconde après 6 heures précises).

Pour MySQL 5.7 et plus récent, la requête correcte est:

 SELECT count(code) AS `count` FROM `table 1` WHERE ID='58' AND (TIME(`DateTime`) <= '06:00:00' OR '20:00:00' <= TIME(`DateTime`)) 

Je ne sais pas à propos de SQL Server .