Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Comparing results with today's date?

Is there a way to use the Now() function in SQL to select values with today's date?

I was under the impression Now() would contain the time as well as date, but today's date would have the time set to 00:00:00 and therefore this would never match?

like image 783
mezamorphic Avatar asked May 01 '12 08:05

mezamorphic


People also ask

How do I query today's date in SQL?

To get the current date and time in SQL Server, use the GETDATE() function. This function returns a datetime data type; in other words, it contains both the date and the time, e.g. 2019-08-20 10:22:34 .

How can I compare two dates in SQL?

This can be easily done using equals to(=), less than(<), and greater than(>) operators. In SQL, the date value has DATE datatype which accepts date in 'yyyy-mm-dd' format. To compare two dates, we will declare two dates and compare them using the IF-ELSE statement.

How do you check if one date is greater than another in SQL?

In this article, we will see the SQL query to check if DATE is greater than today's date by comparing date with today's date using the GETDATE() function. This function in SQL Server is used to return the present date and time of the database system in a 'YYYY-MM-DD hh:mm: ss. mmm' pattern.

Is there a today function in SQL?

SQL Server provides several different functions that return the current date time including: GETDATE(), SYSDATETIME(), and CURRENT_TIMESTAMP.


2 Answers

OK, lets do this properly. Select dates matching today, using indexes if available, with all the different date/time types present.

The principle here is the same in each case. We grab rows where the date column is on or after the most recent midnight (today's date with time 00:00:00), and before the next midnight (tomorrow's date with time 00:00:00, but excluding anything with that exact value).

For pure date types, we can do a simple comparison with today's date.

To keep things nice and fast, we're explicitly avoiding doing any manipulation on the dates stored in the DB (the LHS of the where clause in all the examples below). This would potentially trigger a full table scan as the date would have to be computed for every comparison. (This behaviour appears to vary by DBMS, YMMV).

MS SQL Server: (SQL Fiddle | db<>fiddle)

First, using DATE

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

Now with DATETIME:

select * from datetimes  where dtm >= CAST(CURRENT_TIMESTAMP AS DATE) and dtm < DATEADD(DD, 1, CAST(CURRENT_TIMESTAMP AS DATE)) ; 

Lastly with DATETIME2:

select * from datetimes2 where dtm2 >= CAST(CURRENT_TIMESTAMP AS DATE) and dtm2 < DATEADD(DD, 1, CAST(CURRENT_TIMESTAMP AS DATE)) ; 

MySQL: (SQL Fiddle | db<>fiddle)

Using DATE:

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

Using DATETIME:

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

PostgreSQL: (SQL Fiddle | db<>fiddle)

Using DATE:

select * from dates  where dte = current_date ; 

Using TIMESTAMP WITHOUT TIME ZONE:

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

Oracle: (SQL Fiddle)

Using 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 ; 

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

Using date strings:

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

Using date and time strings:

select dtm from datetimes where dtm >= datetime(date('now')) and dtm < datetime(date('now', '+1 day')) ; 

Using unix timestamps:

select datetime(dtm, 'unixepoch', 'localtime') from datetimes where dtm >= strftime('%s', date('now')) and dtm < strftime('%s', date('now', '+1 day')) ; 

Backup of SQL Fiddle code

like image 194
dwurf Avatar answered Sep 20 '22 01:09

dwurf


There is no native Now() function in SQL Server so you should use:

select GETDATE() --2012-05-01 10:14:13.403 

you can get day, month and year separately by doing:

select DAY(getdate())  --1 select month(getdate())  --5 select year(getdate()) --2012 

if you are on sql server 2008, there is the DATE date time which has only the date part, not the time:

select cast (GETDATE() as DATE) --2012-05-01 
like image 34
Diego Avatar answered Sep 18 '22 01:09

Diego