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)
Pour SQL Server:
select * from myTable where datepart(hh, myDateField) > 17
Voir http://msdn.Microsoft.com/en-us/library/aa258265(SQL.80).aspx .
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.
En MySQL, ce serait
where time(datetimefield) > '17:00:00'
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
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).
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.
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.
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).