Get mySQL MONTH() to use leading zeros?

MysqlSqlDate

Mysql Problem Overview


How do I specify to mySQL's MONTH() function to return '08' instead of 8 in this query?

I'd like the sort to work datewise. Currently getting results for date like

2006-9
2007-1
2007-10
2007-11

current query:

SELECT COUNT(*), CONCAT(YEAR(`datetime_added`), '-', MONTH(`datetime_added`)) as date FROM `person` WHERE (email = '' OR email IS NULL) 
GROUP BY date 
ORDER BY date ASC

Mysql Solutions


Solution 1 - Mysql

Use the following instead:

DATE_FORMAT(`datetime_added`,'%Y-%m')

Explanation:

DATE_FORMAT() function lets you format the date anyway you like using specifiers described in the table below (taken verbatim from documentation). So a format string '%Y-%m' means: "A full year (4 digits), followed by a dash (-), followed by a two-digit month number".

Note that you can specify the language used for day/month names by setting lc_time_names system variable. Extremely useful. Refer to documentation for more details.

Specifier Description
%a Abbreviated weekday name (Sun..Sat)
%b Abbreviated month name (Jan..Dec)
%c Month, numeric (0..12)
%D Day of the month with English suffix (0th, 1st, 2nd, 3rd, …)
%d Day of the month, numeric (00..31)
%e Day of the month, numeric (0..31)
%f Microseconds (000000..999999)
%H Hour (00..23)
%h Hour (01..12)
%I Hour (01..12)
%i Minutes, numeric (00..59)
%j Day of year (001..366)
%k Hour (0..23)
%l Hour (1..12)
%M Month name (January..December)
%m Month, numeric (00..12)
%p AM or PM
%r Time, 12-hour (hh:mm:ss followed by AM or PM)
%S Seconds (00..59)
%s Seconds (00..59)
%T Time, 24-hour (hh:mm:ss)
%U Week (00..53), where Sunday is the first day of the week; WEEK() mode 0
%u Week (00..53), where Monday is the first day of the week; WEEK() mode 1
%V Week (01..53), where Sunday is the first day of the week; WEEK() mode 2; used with %X
%v Week (01..53), where Monday is the first day of the week; WEEK() mode 3; used with %x
%W Weekday name (Sunday..Saturday)
%w Day of the week (0=Sunday..6=Saturday)
%X Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V
%x Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v
%Y Year, numeric, four digits
%y Year, numeric (two digits)
%% A literal % character
%x x, for any “x” not listed above

Solution 2 - Mysql

You can use padding like

SELECT
    COUNT(*), 
    CONCAT(YEAR(`datetime_added`), '-', LPAD(MONTH(`datetime_added`), 2, '0')) as date 
FROM `person` 
WHERE (email = '' OR email IS NULL) 
GROUP BY date 
ORDER BY date ASC

Solution 3 - Mysql

MONTH() returns an integer, so of course there's no leading zero. You will need to convert it to a string, left-pad the '0' and take the last 2 characters.

Solution 4 - Mysql

DATE_FORMAT(`datetime_added`,'%Y - %m')

Solution 5 - Mysql

Using the LPAD function also works

LPAD(MONTH(your_date_column_here),2,'0')

See example below using current date

enter image description here

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
QuestionjerrygarciuhView Question on Stackoverflow
Solution 1 - MysqlMchlView Answer on Stackoverflow
Solution 2 - MysqlDaniView Answer on Stackoverflow
Solution 3 - MysqlJeremy HolovacsView Answer on Stackoverflow
Solution 4 - MysqlOh Chin BoonView Answer on Stackoverflow
Solution 5 - MysqlBlessedHITView Answer on Stackoverflow