Tags: datetime
A quick look at using dates in Mysql
By admin on Jul 24, 2009 | In Daily Commute - Standard hints/tips | Send feedback »
The manipulation of dates in sql is often involved, and Mysql is no exception. I'm going to go over some of the more common requirements when playing with dates in Mysql, but advise that a lot more detail is available in the manual (link :-
date_time_functions_link )
The two main data types you'll probably deploy in Mysql (although there are others) are DATE and DATETIME. If you need to record time of day as well as the date then you'll probably be using DATETIME. If you then want to select records for a certain day accessing a DATETIME field then the function DATE can be very useful:-
Code:
mysql> select dateposted from entries where date(dateposted) = '2008-04-14'; |
Remember always that when inserting (or selecting from) Mysql DATE fields that the default format is 'YYYY-MM-DD'; when importing from a csv file created by Excel remember to first change the format accordingly on the initial Excel field. Another point (which upsets sql purists) is that if the date value being inserted into a DATETIME field is invalid, often the date will be set to '0000-00-00', rather than the insert being rejected. Here's what the mysql manual used to say on the subject:
The MySQL server only performs basic checking on the validity of a date: days 00-31, months 00-12, years 1000-9999. Any date not within this range will revert to 0000-00-00. Please note that this still allows you to store invalid dates such as 2002-04-31. It allows web applications to store data from a form without further checking. To ensure a date is valid, perform a check in your application.
To show the year part of the date use YEAR(
select curdate() will return the current date in yyyy-mm-dd format whereas
select now() will return the current date in a longer datetime format.
For various possibilities in formatting the date output, you can use DATE_FORMAT, for example:
Code:
mysql> select DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'); | |
+------------------------------------------------+ | |
| DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y') | | |
+------------------------------------------------+ | |
| Sunday October 2009 | | |
+------------------------------------------------+ |
Other options include %m (month numeric), %b (abbreviated month name), %e (day of the month numeric), %D (day of month with suffix 1st, 2nd etc). Here's another sql example of DATE_FORMAT:
Code:
mysql> select DATE_FORMAT('2009-10-04 22:23:00', '%e %b %y'); | |
+------------------------------------------------+ | |
| DATE_FORMAT('2009-10-04 22:23:00', '%e %b %y') | | |
+------------------------------------------------+ | |
| 4 Oct 09 | | |
+------------------------------------------------+ |
The DATE_FORMAT function can be very useful for finding the first day of a month eg:
Code:
SELECT DATE_FORMAT('2004-01-20' ,'%Y-%m-01'); |
Once you have this, you can find out the last day of the month, first day of following month etc by using DATE_ADD and DATE_SUB (see below).
To find out the date 50 days from now, use the ADDDATE function, normally using format ADDDATE( date , Number_of_days ), as follows:
Code:
mysql> select curdate(), adddate(curdate(), 50); | |
+------------+------------------------+ | |
| curdate() | adddate(curdate(), 50) | | |
+------------+------------------------+ | |
| 2009-07-21 | 2009-09-09 | | |
+------------+------------------------+ |
You can use PERIOD_DIFF (p1, p2) to find the number of months between 2 dates p1 and p2, so long as p1 and p2 are in format YYMM or YYYYMM.
Code:
mysql> select period_diff(200907,200901); | |
+----------------------------+ | |
| period_diff(200907,200901) | | |
+----------------------------+ | |
| 6 | | |
+----------------------------+ |
select period_diff(date_format(now(), '%Y%m'), date_format(hiredate, '%Y%m')) as months from emp;
It has to be said however, that the normal method of date arithmetics in Mysql is done with the functions date_sub and date_add.
Code:
mysql> select date_sub('2005-01-01 00:05:00', INTERVAL 1 DAY); | |
+-------------------------------------------------+ | |
| date_sub('2005-01-01 00:05:00', INTERVAL 1 DAY) | | |
+-------------------------------------------------+ | |
| 2004-12-31 00:05:00 | | |
+-------------------------------------------------+ |
Code:
mysql> select DATE_ADD('2010-12-31 23:58:00', INTERVAL 1 DAY); | |
+-------------------------------------------------+ | |
| DATE_ADD('2010-12-31 23:58:00', INTERVAL 1 DAY) | | |
+-------------------------------------------------+ | |
| 2011-01-01 23:58:00 | | |
+-------------------------------------------------+ |