How to Query Date and Time in MySQL

MySQL has the following functions to get the current date and time:

SELECT now();  -- date and time
SELECT curdate(); --date
SELECT curtime(); --time in 24-hour format

To find rows between two dates or timestamps:

SELECT *
FROM events
where event_date between '2018-01-01' and '2018-01-31';

-- Can include time by specifying in YYYY-MM-DD hh:mm:ss format:
SELECT *
FROM events
WHERE event_date BETWEEN '2018-01-01 12:00:00' AND '2018-01-01 23:30:00';

To find rows created within the last week:

SELECT *
FROM events
WHERE event_date > date_sub(now(), interval 1 week);

There's also DATE_ADD(). For example, to find events scheduled between one week ago and 3 days from now:

SELECT *
FROM events
WHERE event_date BETWEEN date_sub(now(), interval 1 week) AND date_add(now(), interval 3 day);

You can extract part of a timestamp by applying the corresponding function:

SELECT year(now()); -- or month(), day(), hour(), minute(), second()

To get a day of week from a timestamp, use the DAYOFWEEK() function:

-- returns 1-7 (integer), where 1 is Sunday and 7 is Saturday
SELECT dayofweek('2018-12-12');

-- returns the string day name like Monday, Tuesday, etc
SELECT dayname(now());

To convert a timestamp to a unix timestamp (integer seconds):

-- This will assume time to be 12am
SELECT unix_timestamp('2018-12-09');

-- You can specify an exact timestamp to be converted down to the second
SELECT unix_timestamp('2018-12-09 14:53:21');

-- calling unix_timestamp without a parameter will be like calling it for current timestamp
SELECT unix_timestamp(); -- same as SELECT unix_timestamp(now());

To calculate the difference between two timestamps, convert them to unix timestamps then perform the subtraction:

-- show seconds between delivery and shipping timestamps
SELECT unix_timestamp(delivered_at) - unix_timestamp(shipped_at);
FROM deliveries;

-- convert computed difference to hh:mm:ss format:
SELECT sec_to_time(unix_timestamp(delivered_at) - unix_timestamp(shipped_at))
FROM deliveries;

Note that MySQL also has DATEDIFF() and TIMEDIFF() functions, but they can only used with purely date values or purely time values, respectively.

database icon
SQL editing that just rocks
PopSQL and MySQL, better together