2016-03-25 13 views
3

Ich habe eine 2 Spalten namens ID und Publish_Date. publish_date ist im Varchar-Format (z. B. 2015-11-08 20:11:59). Ich habe den folgenden Code verwendet, um die Ergebnisse nach Monat zu filtern:Filter Monat in Mysql, wenn das Datum in Varchar ist

SELECT * FROM 'table' WHERE MONTH(STR_TO_DATE(publish_date, '%d/%m/%Y')) = 11 

MySQL gab eine leere Ergebnismenge zurück. Was ist los?

+0

Der Ausdruck auf der linken Seite des Vergleichs gibt NULL zurück. Und NULL ist niemals "gleich elf". Und dieser Ausdruck gibt NULL zurück, weil dies das Ergebnis der Umwandlung des Zeichenfolgenwerts in DATETIME ist, weil das angegebene Format (als zweites Argument für STR_TO_DATE) nicht mit dem Format des strnig-Werts übereinstimmt. MySQL kann die Zeichenfolge nicht in DATETIME konvertieren. – spencer7593

Antwort

2

ist Wenn Sie die Funktion manuell bezeichnet hatte, würden Sie das zweite Argument sehen soll das angegebene Datum Format.

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_str-to-date

Wenn Sie sind varchar Eintrag 2015-11-08 20:11:59 ist, dann müssen Sie ein Format von '%Y-%m-%d %h:%i:%s'

+0

Hoppla. Ich wollte das Format "% y /% m% d" schreiben. Aber ja, ich hätte das '-' anstelle von '/' verwenden sollen. Dies ist, was passiert, wenn Sie auf nüchternen Magen arbeiten :(Wie auch immer, danke an alle, die geantwortet haben. –

1

In Ihrer Anfrage, wenn Sie Datum von varchar bisher konvertieren können Sie dieses Format geben, die in der Spalte wie ('% Y-% m-% d' für 2015.11.08)

I verwendet wird, nehmen Ihre publish_date (2015.11.08) Format yyyy-mm-dd

SELECT * FROM 'table' WHERE MONTH(STR_TO_DATE(publish_date, '%Y-%m-%d')) = 11; 
0

Zeitstempel Charakter geben ist das Format

2015-11-08 20:11:59 

daher Ihre Format-String die Sie Pass in STR_TO_DATE() sollte

%Y-%m-%d %h:%i:%s 

SELECT * 
FROM 'table' 
WHERE MONTH(STR_TO_DATE(publish_date, '%Y-%m-%d %h:%i:%s')) = 11 
sein

Für Dokumentation über die Verwendung verschiedener Arten von Formatzeichenfolgen bevorzuge ich TechOnTheNet.

3

Hier ist eine Lösung mit TIMESTAMP().

SELECT * FROM `table` WHERE MONTH(TIMESTAMP(publish_date)) = 11 

Demo:

mysql> select MONTH(TIMESTAMP('2015-11-08 20:11:59')); 
+-----------------------------------------+ 
| MONTH(TIMESTAMP('2015-11-08 20:11:59')) | 
+-----------------------------------------+ 
|          11 | 
+-----------------------------------------+ 
1 row in set (0.00 sec) 
0

Das Format, in STR_TO_DATE angegeben nicht das Format von publish_date entsprechen.

(Gibt es einen guten Grund, warum publish_date nicht als DATETIME- Spalte definiert ist?)

Testen Sie Ihre Umwandlung, ein anderes Format verwenden, eine, die das Format der Strings paßt ...

SELECT STR_TO_DATE(publish_date,'%Y-%m-%d %T') 
    FROM `table` 
    LIMIT 10 

Dieses zweite Argument der STR_TO_DATE-Funktion hat eine spezifische Bedeutung. Es ist nicht nur ein Wirrwarr von Kauderwelsch.

http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format

das Format der publish_date Zeichenfolge Gegeben entspricht dem Standardformat für MySQL DATETIME-, können Sie die expliziten Verweis weglassen könnte Funktion STR_TO_DATE:

MONTH(publish_date) = 11 

Aber persönlich würde ich die STR_TO_DATE Funktion enthalten, um die Konvertierung explizit zu machen.

Aber wenn ich hatte zu tun, was Sie tun müssen, VARCHAR-Werte zu vergleichen, ich wouldn; t mit der Umwandlung es bisher Mühe, ich würde nur SUBSTRING-Funktion verwenden, um die fünfte bis achte Zeichen zu extrahieren

SUBSTR(publish_date,5,4) = '-11-' 
0

sollte Ihre Anfrage sein, wie pro unten-

SELECT * FROM 'table' WHERE MONTH(STR_TO_DATE(publish_date, '%Y-%m-%d')) = 11; 

hier müssen Sie verstehen, dass Sie versuchen, Ihre Zeichenfolge Datumsformat zu konvertieren bedeutet hier Sie mysql sagen müssen, dass die Zeichenfolge, in welchem ​​Format ist nicht in dem Format, das Sie konvertieren möchten -

Um es zu verstehen, wenn Sie das Datum Zeichenfolge '08/11/2015 20.11.59' annehmen wird, dann sollten Sie Ihre Abfrage

SELECT * FROM 'table' WHERE MONTH(STR_TO_DATE(publish_date, '%d/%m/%Y')) = 11; 

Hoffnung jetzt BE- es Ihnen klar sein wird.

Verwandte Themen