web-dev-qa-db-fra.com

Comparer les résultats avec la date d'aujourd'hui?

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?

65
mezamorphic

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
71
Diego

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'))
;

sauvegarde de SQL Fiddle code

91
dwurf

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

7
David Adlington

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)
5
Jonathan Sayce

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.

5
Paul

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
3
itayw

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).

2
YvesR

Cela a fonctionné pour moi:

SELECT * FROM table where date(column_date) = curdate()
0
Ionut Catana

Tu peux essayer:

WHERE created_date BETWEEN CURRENT_TIMESTAMP-180 AND CURRENT_TIMESTAMP
0
Sriram R iyer

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') 
0
erdemildiz