MySQL MONTH () dazu bringen, führende Nullen zu verwenden?

91

Wie spezifiziere ich für die MONTH () - Funktion von mySQL, dass in dieser Abfrage '08' anstelle von 8 zurückgegeben wird?

Ich möchte, dass die Sortierung datumsmäßig funktioniert. Derzeit erhalten Ergebnisse für Datum wie

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

aktuelle Abfrage:

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
jerrygarciuh
quelle

Antworten:

204

Verwenden Sie stattdessen Folgendes:

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

Erläuterung:

DATE_FORMAT()Mit dieser Funktion können Sie das Datum beliebig formatieren, indem Sie die in der folgenden Tabelle beschriebenen Bezeichner verwenden (wörtlich aus der Dokumentation entnommen ). Eine Formatzeichenfolge '%Y-%m'bedeutet also: "Ein ganzes Jahr (4 Ziffern), gefolgt von einem Bindestrich ( -), gefolgt von einer zweistelligen Monatszahl".

Beachten Sie, dass Sie die Sprache für Tag- / Monatsnamen angeben können, indem Sie die lc_time_namesSystemvariable festlegen . Extrem nützlich. Weitere Informationen finden Sie in der Dokumentation .

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
%u  Week (00..53), where Monday is the first day of the week
%V  Week (01..53), where Sunday is the first day of the week; used with %X
%v  Week (01..53), where Monday is the first day of the week; 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 
Mchl
quelle
8
Obwohl dies nicht das ist, was er gefragt hat, scheint dies zu beantworten, was er hätte fragen sollen.
Jeremy Holovacs
Warum kann der Tag des Monats 0 sein?
SOFe
Weil 0000-00-00 ein gültiges Datum ist (abhängig von den Einstellungen)
Mchl
2
@SOFe> Bereiche für die Monats- und Tagesspezifizierer beginnen mit Null, da MySQL das Speichern unvollständiger Daten wie '2014-00-00' ermöglicht. dev.mysql.com/doc/refman/5.6/en/…
kio21
Genial, hat wie ein Zauber funktioniert :)
Mizo Games
30

Sie können Polster wie verwenden

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
Dani
quelle
Erfüllte das Bedürfnis im Bienenstock. Die Funktion DATE_FORMAT () wird in Hive nicht unterstützt. Ihre Antwort hilft.
Guangtong Shen
6
DATE_FORMAT(`datetime_added`,'%Y - %m')
Oh Chin Boon
quelle
1
Ich glaube ohne Leerzeichen:'%Y-%m'
SrAxi
4

MONTH () gibt eine ganze Zahl zurück, daher gibt es natürlich keine führende Null. Sie müssen es in eine Zeichenfolge konvertieren, die '0' mit der linken Maustaste auffüllen und die letzten 2 Zeichen übernehmen.

Jeremy Holovacs
quelle