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

Existe-t-il un moyen d'utiliser la fonction Now() dans SQL pour sélectionner des valeurs avec la date d'aujourd'hui?

J'avais l'impression que Now() contiendrait l'heure ainsi que la date, mais la date d'aujourd'hui aurait l'heure définie sur 00:00:00 et donc cela ne correspondrait jamais?

60
demandé sur DineshDB 2012-05-01 12:47:26

9 réponses

Il N'y a pas de fonction native Now () 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 par:

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 time qui n'a que la partie date, pas l'heure:

select cast (GETDATE() as DATE) --2012-05-01
68
répondu Diego 2012-05-02 11:17:21

OK, faisons cela correctement. Sélectionnez les dates correspondant aujourd'hui, en utilisant des index si disponibles, avec tous les différents types de date/heure présents.

Le principe ici est le même dans chaque cas. Nous prenons des lignes où la colonne date est à ou après la minuit la plus récente (date d'aujourd'hui avec l'Heure 00:00:00), et avant la prochaine minuit (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 date.

Pour garder les choses agréables et rapides, nous évitons explicitement de faire toute manipulation sur les 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: (SQL Violon | dbviolon)

Tout d'abord, en utilisant la DATE

select * from dates 
where dte = CAST(CURRENT_TIMESTAMP AS DATE)
;

Maintenant avec Date et heure:

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: (SQL Violon | dbviolon)

En utilisant la DATE:

select * from dates 
where dte = cast(now() as date)
;

En utilisant DATETIME:

select * from datetimes 
where dtm >= cast((now()) as date)
and dtm < cast((now() + interval 1 day) as date)
;

PostgreSQL: (SQL Violon | dbviolon)

En utilisant la DATE:

select * from dates 
where dte = current_date
;

Utilisation de L'horodatage sans fuseau horaire:

select * from timestamps
where ts >= 'today'
and ts < 'tomorrow'
;

Oracle: (vous avez besoin d'aide?]}

En utilisant 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 L'horodatage:

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: (vous avez besoin d'aide?]}

Utilisation de chaînes de date:

select * from dates 
where dte = (select date('now'))
;

Utilisation des 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 Violon code

83
répondu dwurf 2018-10-02 08:00:41

Pas sûr de ce que vous demandez!

Cependant

SELECT  GETDATE()

, vous obtiendrez la date et l'heure actuelles

SELECT  DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

Vous obtenez juste la date avec l'heure à 00:00:00

7
répondu David Adlington 2012-05-01 08:55:59

Je ne sais pas exactement ce que vous essayez de faire, mais il semble que GETDATE() est ce que vous recherchez. GETDATE() renvoie un datetime, mais si le composant time ne vous intéresse pas, vous pouvez convertir une date.

SELECT  GETDATE()
SELECT  CAST(GETDATE() AS DATE)
5
répondu Jonathan Sayce 2012-05-01 08:51:00

Il suffit de mettre à zéro l'élément time de la date. par exemple

select    DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

J'ai utilisé GetDate car c'est une fonction MSSQL, comme vous l'avez balisé, mais Now() est probablement MySQL ou vous utilisez L'appel de fonction ODBC, devrait toujours fonctionner si vous remplacez simplement l'un par l'autre.

5
répondu Paul 2012-05-02 12:10:17

Sur la base des réponses précédentes, veuillez noter un point important, vous devez également manipuler votre colonne de table pour vous assurer qu'elle ne contient pas le fragment temporel du type de données datetime.

Voici un petit exemple de script démontrant 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 cela aide.

Modifier:
Après le commentaire @dwurf (merci) sur l'effet que l'exemple ci-dessus peut avoir sur les performances, Je voudrais suggérer ce qui suit à la place. Nous créons une date plage entre aujourd'hui à minuit (début de la journée) et la dernière milliseconde de la journée (nombre SQL server jusqu'à .997, c'est pourquoi je réduis 3 millisecondes). De cette manière, nous évitons de manipuler le côté gauche et d'éviter 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
répondu itayw 2012-05-01 09:22:21

Si vous avez une table avec juste une date stockée (pas de temps) et que vous voulez les 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 jour est 0 (donc aujourd'hui).

2
répondu YvesR 2012-05-01 09:12:45

, 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
répondu erdemildiz 2015-10-22 07:34:13

Où created_date entre CURRENT_TIMESTAMP-180 et CURRENT_TIMESTAMP

0
répondu Sriram R iyer 2016-08-10 04:51:54