web-dev-qa-db-fra.com

Comment obtenir des enregistrements après un certain temps en utilisant le champ date/heure SQL

Si j'ai un champ date/heure, comment puis-je obtenir uniquement les enregistrements créés après une certaine heure, en ignorant complètement la date?

C'est une table de journalisation, elle indique quand les gens se connectent et font quelque chose dans notre application. Je veux savoir à quelle fréquence les gens sont plus tard que 17 heures.

(Désolé - c'est SQL Server. Mais cela pourrait être utile pour d'autres personnes pour d'autres bases de données)

14
thursdaysgeek

Pour SQL Server:

select * from myTable where datepart(hh, myDateField) > 17

Voir http://msdn.Microsoft.com/en-us/library/aa258265(SQL.80).aspx .

17
Luke Bennett

Quel système de base de données utilisez-vous? Les fonctions de date/heure varient considérablement.

Pour Oracle, on pourrait dire

SELECT * FROM TABLE 
  WHERE TO_CHAR(THE_DATE, 'HH24:MI:SS') BETWEEN '17:00:00' AND '23:59:59';

En outre, vous devez probablement passer au lendemain et choisir des heures entre minuit et 6 heures, par exemple.

5
Thilo

En MySQL, ce serait

where time(datetimefield) > '17:00:00'
4
ysth

Pour MSSQL, utilisez la méthode CONVERT:


DECLARE @TempDate   datetime = '1/2/2016 6:28:03 AM'
SELECT  
    @TempDate as PassedInDate,  
    CASE 
        WHEN CONVERT(nvarchar(30), @TempDate, 108) < '06:30:00' then 'Before 6:30am'
        ELSE 'On or after  6:30am'
    END,
    CASE 
        WHEN CONVERT(nvarchar(30), @TempDate, 108) >= '10:30:00' then 'On or after 10:30am'
        ELSE 'Before 10:30am'
    END 
1
Zaxxon

La meilleure chose à laquelle je puisse penser est la suivante: n'utilisez pas de champ DateTime; Eh bien, vous pourriez utiliser beaucoup de DATEADD/DATEPART, etc., mais cela sera lent si vous avez beaucoup de données, car il ne peut pas vraiment utiliser d'index ici. Votre base de données peut offrir nativement un type approprié - tel que le type TIME dans SQL Server 2008 - mais vous pouvez également stocker le décalage temporel en minutes (par exemple).

1
Marc Gravell

Une autre méthode Oracle pour des situations simples:

select ...
from   ...
where  EXTRACT(HOUR FROM my_date) >= 17
/

http://download.Oracle.com/docs/cd/B19306_01/server.102/b14200/functions050.htm#SQLRF00639

Difficile pour quelques questions cependant, comme tous les disques avec le temps entre 15:03:21 et 15:25:45. Je voudrais aussi utiliser la méthode TO_CHAR ici.

0
David Aldridge

Ok, je l'ai.

select myfield1, 
       myfield2, 
       mydatefield
  from mytable
 where datename(hour, mydatefield) > 17

Cela me permettra d’enregistrer des enregistrements avec mydatefield dans un délai supérieur à 17 heures.

0
thursdaysgeek

Dans Informix, en supposant que vous utilisiez un champ DATETIME ANNEE AU SECOND pour conserver la date complète, vous écririez:

WHERE EXTEND(dt_column, HOUR TO SECOND) > DATETIME(17:00:00) HOUR TO SECOND

'EXTEND' peut en effet contracter l'ensemble des champs (ainsi que l'étendre, comme son nom l'indique).

Comme Thilo l'a noté, il s'agit d'un domaine extrêmement varié entre les SGBD (et Informix est certainement l'une des variantes).

0
Jonathan Leffler