How to compare timestamp dates with date-only parameter in MySQL?

MysqlDatetimeDate

Mysql Problem Overview


In a SQL statement, how do I compare a date saved as TIMESTAMP with a date in YYYY-MM-DD format?

Ex.: SELECT * FROM table WHERE timestamp = '2012-05-25'

I want this query returns all rows having timestamp in the specified day, but it returns only rows having midnight timestamp.

thanks

Mysql Solutions


Solution 1 - Mysql

You can use the DATE() function to extract the date portion of the timestamp:

SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-25'

Though, if you have an index on the timestamp column, this would be faster because it could utilize an index on the timestamp column if you have one:

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-25 00:00:00' AND '2012-05-25 23:59:59'

Solution 2 - Mysql

 WHERE cast(timestamp as date) = '2012-05-05'

Solution 3 - Mysql

As suggested by some, by using DATE(timestamp) you are applying manipulation to the column and therefore you cannot rely on the index ordering.

However, using BETWEEN would only be reliable if you include the milliseconds. In the example timestamp BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59' you exclude records with a timestamp between 2012-05-05 23:59:59.001 and 2012-05-05 23:59:59.999. However, even this method has some problems, because of the datatypes precision. Occasionally 999 milliseconds is rounded up.

The best thing to do is:

SELECT * FROM table
WHERE date>='2012-05-05' AND date<'2012-05-06'

Solution 4 - Mysql

SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'

Solution 5 - Mysql

Use a conversion function of MYSQL :

SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05' 

This should work

Solution 6 - Mysql

As I was researching this I thought it would be nice to modify the BETWEEN solution to show an example for a particular non-static/string date, but rather a variable date, or today's such as CURRENT_DATE(). This WILL use the index on the log_timestamp column.

SELECT *
FROM some_table
WHERE
	log_timestamp
    BETWEEN 
		timestamp(CURRENT_DATE()) 
	AND # Adds 23.9999999 HRS of seconds to the current date
		timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL '86399.999999' SECOND_MICROSECOND));

I did the seconds/microseconds to avoid the 12AM case on the next day. However, you could also do `INTERVAL '1 DAY' via comparison operators for a more reader-friendly non-BETWEEN approach:

SELECT *
FROM some_table
WHERE
    log_timestamp >= timestamp(CURRENT_DATE()) AND
    log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));

Both of these approaches will use the index and should perform MUCH faster. Both seem to be equally as fast.

Solution 7 - Mysql

In case you are using SQL parameters to run the query then this would be helpful

SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')

Solution 8 - Mysql

Use

SELECT * FROM table WHERE DATE(2012-05-05 00:00:00) = '2012-05-05' 

Solution 9 - Mysql

When I read your question, I thought your were on Oracle DB until I saw the tag 'MySQL'. Anyway, for people working with Oracle here is the way:

SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');

Solution 10 - Mysql

SELECT * FROM table WHERE DATE(timestamp) = '2012-05-25' 

It will work but not used index on "timestamp" column if you have any because of DATE function. below query used index and give better performance

SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'

OR

SELECT * FROM table
WHERE timestamp >= '2012-05-05' AND timestamp < '2012-05-06'

Try running these to check stats

explain SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-25' 
explain SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMichaelView Question on Stackoverflow
Solution 1 - MysqlMarcus AdamsView Answer on Stackoverflow
Solution 2 - Mysqljuergen dView Answer on Stackoverflow
Solution 3 - MysqlTom KitsonView Answer on Stackoverflow
Solution 4 - MysqlCfreakView Answer on Stackoverflow
Solution 5 - MysqladrienView Answer on Stackoverflow
Solution 6 - MysqlasnyderView Answer on Stackoverflow
Solution 7 - MysqldeveshView Answer on Stackoverflow
Solution 8 - MysqlMuhammad FahadView Answer on Stackoverflow
Solution 9 - MysqlKeyMaker00View Answer on Stackoverflow
Solution 10 - MysqlJhamman SharmaView Answer on Stackoverflow