Est-il possible d'utiliser la fonction Now()
en SQL pour sélectionner des valeurs avec la date du jour?
J'avais l'impression que Now()
contiendrait l'heure ainsi que la date, mais la date d'aujourd'hui aurait l'heure réglée sur 00:00:00
et donc cela ne correspondrait jamais?
Il n'y a pas de fonction Now () native dans SQL Server, vous devez donc utiliser:
select GETDATE() --2012-05-01 10:14:13.403
vous pouvez obtenir le jour, le mois et l'année séparément en faisant:
select DAY(getdate()) --1
select month(getdate()) --5
select year(getdate()) --2012
si vous êtes sur SQL Server 2008, il y a la date date heure qui n'a que la partie date, pas l'heure:
select cast (GETDATE() as DATE) --2012-05-01
OK, faisons ceci correctement. Sélectionnez les dates correspondant aujourd'hui, en utilisant les index si disponibles, avec tous les types de date/heure présents.
Le principe est le même dans chaque cas. Nous prenons les lignes dont la colonne de date est à ou après minuit le plus récent (date du jour avec l'heure 00:00:00) et avant le minuit suivant (date de demain avec l'heure 00:00:00, mais en excluant tout ce qui a cette valeur exacte ).
Pour les types de date purs, nous pouvons faire une simple comparaison avec la date du jour.
Pour que tout soit facile et rapide, nous évitons explicitement toute manipulation des dates stockées dans la base de données (le LHS de la clause where
dans tous les exemples ci-dessous). Cela déclencherait potentiellement une analyse complète de la table car la date devrait être calculée pour chaque comparaison. (Ce comportement semble varier selon le SGBD, YMMV).
MS SQL Server: ( Violon SQL | db <> violon )
Tout d'abord, en utilisant DATE
select * from dates
where dte = CAST(CURRENT_TIMESTAMP AS DATE)
;
Maintenant avec DATETIME:
select * from datetimes
where dtm >= CAST(CURRENT_TIMESTAMP AS DATE)
and dtm < DATEADD(DD, 1, CAST(CURRENT_TIMESTAMP AS DATE))
;
Enfin avec DATETIME2:
select * from datetimes2
where dtm2 >= CAST(CURRENT_TIMESTAMP AS DATE)
and dtm2 < DATEADD(DD, 1, CAST(CURRENT_TIMESTAMP AS DATE))
;
MySQL: ( Violon SQL | db <> fiddle )
Utilisation de DATE:
select * from dates
where dte = cast(now() as date)
;
Utilisation de DATETIME:
select * from datetimes
where dtm >= cast((now()) as date)
and dtm < cast((now() + interval 1 day) as date)
;
PostgreSQL: ( Violon SQL | db <> violon )
Utilisation de DATE:
select * from dates
where dte = current_date
;
Utilisation de TIMESTAMP SANS Fuseau horaire:
select * from timestamps
where ts >= 'today'
and ts < 'tomorrow'
;
Oracle: ( SQL Fiddle )
Utilisation de DATE:
select to_char(dte, 'YYYY-MM-DD HH24:MI:SS') dte
from dates
where dte >= trunc(current_date)
and dte < trunc(current_date) + 1
;
Utilisation de TIMESTAMP:
select to_char(ts, 'YYYY-MM-DD HH24:MI:SS') ts
from timestamps
where ts >= trunc(current_date)
and ts < trunc(current_date) + 1
;
SQLite: ( SQL Fiddle )
Utilisation de chaînes de date:
select * from dates
where dte = (select date('now'))
;
Utilisation de chaînes de date et d'heure:
select dtm from datetimes
where dtm >= datetime(date('now'))
and dtm < datetime(date('now', '+1 day'))
;
Utilisation des horodatages Unix:
select datetime(dtm, 'unixepoch', 'localtime') from datetimes
where dtm >= strftime('%s', date('now'))
and dtm < strftime('%s', date('now', '+1 day'))
;
Pas sûr de ce que vous demandez!
Pourtant
SELECT GETDATE()
Vous obtiendrez la date et l'heure actuelles
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
Vous obtiendrez juste la date avec l'heure réglée sur 00:00:00
Vous ne savez pas exactement ce que vous essayez de faire, mais cela ressemble à GETDATE()
, c'est ce que vous recherchez. GETDATE()
renvoie une date/heure, mais si vous n'êtes pas intéressé par le composant heure, vous pouvez convertir une date en une date.
SELECT GETDATE()
SELECT CAST(GETDATE() AS DATE)
Juste mettre à zéro l'élément de l'heure de la date. par exemple.
SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
J'ai utilisé GetDate en tant que fonction MSSQL, comme vous l'avez indiqué, mais Now()
est probablement MySQL ou si vous utilisez l'appel de fonction ODBC, devrait toujours fonctionner si vous venez d'en remplacer un. avec l'autre.
En vous basant sur les réponses précédentes, veuillez noter un point important, vous devez également manipuler votre colonne de table pour s’assurer qu’elle ne contient pas le fragment time du type de données datetime.
Vous trouverez ci-dessous un exemple de script illustrant ce qui précède:
select getdate()
--2012-05-01 12:06:51.413
select cast(getdate() as date)
--2012-05-01
--we're using sysobjects for the example
create table test (id int)
select * from sysobjects where cast(crdate as date) = cast(getdate() as date)
--resultset contains only objects created today
drop table test
J'espère que ça aide.
EDIT:
Après les commentaires de @dwurf (merci) sur l’effet que l’exemple ci-dessus peut avoir sur les performances, je voudrais plutôt suggérer ce qui suit. Nous créons une plage de dates entre aujourd'hui à minuit (début de la journée) et la dernière milliseconde de la journée (le nombre de serveurs SQL allant jusqu'à .997, raison pour laquelle je réduis 3 millisecondes). De cette manière, nous évitons de manipuler le côté gauche et l’impact sur les performances.
select getdate()
--2012-05-01 12:06:51.413
select dateadd(millisecond, -3, cast(cast(getdate()+1 as date) as datetime))
--2012-05-01 23:59:59.997
select cast(getdate() as date)
--2012-05-01
create table test (id int)
select * from sysobjects where crdate between cast(getdate() as date) and dateadd(millisecond, -3, cast(cast(getdate()+1 as date) as datetime))
--resultset contains only objects created today
drop table test
Si vous avez une table avec juste une date stockée (pas d'heure) et que vous voulez l'obtenir par "maintenant", alors vous pouvez faire ceci:
SELECT * FROM tbl WHERE DATEDIFF(d, yourdate, GETDATE())=0
Il en résulte des lignes dont la différence de jours est 0 (donc aujourd'hui).
Cela a fonctionné pour moi:
SELECT * FROM table where date(column_date) = curdate()
Tu peux essayer:
WHERE created_date BETWEEN CURRENT_TIMESTAMP-180 AND CURRENT_TIMESTAMP
Vous pouvez essayer ce code SQL;
SELECT [column_1], [column_1], ...
FROM (your_table)
where date_format(record_date, '%e%c%Y') = date_format(now(), '%e%c%Y')