2017-11-10 1 views
0

Mit der exakt gleichen Tabelle, wenn ich die folgenden zwei Abfragen auf MYSQL (Version 5.6.37) ausführen, bekomme ich sehr unterschiedliche Ergebnisse, die für mich keinen Sinn macht ...Warum verwendet das Jahr 20.000 in MySQL ein anderes Ergebnis

SELECT COUNT(*) FROM salesTransactions WHERE date<'2000-01-01' 

Ich bekomme 159 Ergebnisse (wie erwartet). Jedoch, wenn ich dann den gleichen Bericht laufen, aber das Jahr zu 20.000 erhöhe ich ein ganz anderes Ergebnis:

SELECT COUNT(*) FROM salesTransactions WHERE date<'20000-01-01' 

ich das Ergebnis 6.

Wie ist das möglich? Wenn ich das Datum auf 30.000 ändere, erhalte ich die erwartete Ergebniszahl. Ich spielte herum und das Jahr 20100 hat 8 Ergebnisse, was eine andere Nummer ist.

Der Tisch ist:

ID: integer Datum: Datum Name: varchar (32)

Wie kann das sein?

+2

Es wäre nett, wenn Sie eine SQL-Fiddle mit Beispieldaten erstellt haben, wo wir dieses Verhalten reproduzieren können. Meine Vermutung ist, dass Ihr Datumsfeld kein Datum ist, sondern varchar und daher verwendet mysql einen Textvergleich im Gegensatz zum Datumsvergleich. Ohne Daten lautet meine Antwort: Ich konnte dein Verhalten nicht reproduzieren. – Shadow

+1

Es ist ein Datumsfeld. –

+1

Der Typ DATE wird für Werte mit einem Datumsteil aber keinem Zeitteil verwendet. MySQL ruft DATE-Werte im Format 'JJJJ-MM-TT' ab und zeigt sie an. Der unterstützte Bereich ist "1000-01-01" bis "9999-12-31". Der Datentyp DATETIME wird für Werte verwendet, die Datums- und Uhrzeitteile enthalten. MySQL ruft DATETIME-Werte im Format 'JJJJ-MM-TT HH: MM: SS' ab und zeigt sie an. Der unterstützte Bereich ist "1000-01-01 00:00:00" bis "9999-12-31 23:59:59". Der Datentyp TIMESTAMP wird für Werte verwendet, die Datums- und Uhrzeitteile enthalten. TIMESTAMP hat eine Bandbreite von '1970-01-01 00:00:01' UTC bis '2038-01-19 03:14:07' UTC. –

Antwort

1

Der Typ DATE wird für Werte mit einem Datumsteil, aber keinem Zeitteil verwendet. MySQL ruft DATE-Werte im Format 'JJJJ-MM-TT' ab und zeigt sie an. Der unterstützte Bereich ist "1000-01-01" bis "9999-12-31". Der DATETIME-Typ wird für Werte verwendet, die Datums- und Uhrzeitteile enthalten. MySQL ruft DATETIME-Werte im Format 'JJJJ-MM-TT HH: MM: SS' ab und zeigt sie an. Der unterstützte Bereich ist "1000-01-01 00:00:00" bis "9999-12-31 23:59:59". Der TIMESTAMP-Datentyp wird für Werte verwendet, die Datums- und Uhrzeitteile enthalten. TIMESTAMP hat eine Bandbreite von '1970-01-01 00:00:01' UTC bis '2038-01-19 03:14:07' UTC. (https://dev.mysql.com/doc/refman/5.7/en/datetime.html)

Interessanterweise würden Sie erwarten, dass die implizite Datumsumwandlung null zurückgibt und die Abfrage daher nichts zurückgeben würde. Also habe ich einen kleinen Test gemacht.

Select count(*) from awsalesorderheader 
union all 
select count(*) from awsalesorderheader where orderdate < '9999-01-01' 
union all 
select count(*) from awsalesorderheader where orderdate < '20049-01-01' 
union all 
select count(*) from awsalesorderheader where orderdate < '20050-01-01' 
union all 
select count(*) from awsalesorderheader where orderdate < '20070-01-01' 
union all 
select count(*) from awsalesorderheader where orderdate < '10000-01-01' 
union all 
select count(*) from awsalesorderheader where orderdate < '40000-01-01' 
union all 
select count(*) from awsalesorderheader where orderdate < '30000-01-01' 
union all 
select count(*) from awsalesorderheader where orderdate < null 
; 

+----------+ 
| count(*) | 
+----------+ 
| 31466 | 
| 31466 | 
|  0 | 
|  1379 | 
| 17514 | 
|  0 | 
| 31466 | 
| 31466 | 
|  0 | 
+----------+ 
9 rows in set (0.26 sec) 

Hinweis gibt es einen Cutoff bei 20049-01-01 nach dem ich beginnen zählt> 0 Mein Kopf zu bekommen springt auf den (wahrscheinlich falsch) Schluss, dass y2k nicht verschwunden ist.

Verwandte Themen