Sida 1 av 1

MySQL: Problem med CURDATE()

Postat: 27 feb 2018, 19:21
av Christian Holmberg
Har en tabell som ser ut som följande:

Kod: Markera allt

--------------
DESCRIBE Transactions
--------------

+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| TransID | int(11)     | NO   | PRI | NULL    | auto_increment |
| OrderID | int(11)     | NO   | MUL | NULL    |                |
| DVDID   | smallint(6) | NO   | MUL | NULL    |                |
| DateOut | date        | NO   |     | NULL    |                |
| DateDue | date        | NO   |     | NULL    |                |
| DateIn  | date        | NO   |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
När jag försöker köra kommandot:

Kod: Markera allt

> INSERT INTO Transactions (OrderID, DVDID, DateOut, DateDue) VALUES (1, 1, CURDATE(), CURDATE()+3);
Så får jag följande felmedeleande:

Kod: Markera allt

ERROR 1292 (22007): Incorrect date value: '20180230' for column 'DateDue' at row 1
jag kan dock köra

Kod: Markera allt

--------------
SELECT CURDATE() + 3
--------------

+---------------+
| CURDATE() + 3 |
+---------------+
|      20180230 |
+---------------+
1 row in set (0,00 sec)
utan några större problem, bortsätt från att feburari inte har 30 dagar.
Hur kan man råda bot på mina problem?

Re: MySQL: Problem med CURDATE()

Postat: 27 feb 2018, 19:50
av Nemo
Christian Holmberg skrev: När jag försöker köra kommandot:

Kod: Markera allt

> INSERT INTO Transactions (OrderID, DVDID, DateOut, DateDue) VALUES (1, 1, CURDATE(), CURDATE()+3);
Så får jag följande felmedeleande:

Kod: Markera allt

ERROR 1292 (22007): Incorrect date value: '20180230' for column 'DateDue' at row 1
Felmeddelandet anger att 20180230 inte är ett giltigt datum, vilket stämmer, då det inte finns nǻgon 30 februari.

Verkar vara någon bugg. Vad händer om du anger CURDATE()+5 ? Får du 20180301 då? Har inte provat MySQL, men normalt ska den räkna ut rätt datum. Vet inte varför den har problem med just februari månad.
Christian Holmberg skrev:jag kan dock köra

Kod: Markera allt

--------------
SELECT CURDATE() + 3
--------------

+---------------+
| CURDATE() + 3 |
+---------------+
|      20180230 |
+---------------+
1 row in set (0,00 sec)
utan några större problem, bortsätt från att feburari inte har 30 dagar.
Hur kan man råda bot på mina problem?
Detta stärker mina misstankar att det är en bugg i MySQL. Den ska inte ge svaret 20180230 på den fråga du kör, utan borde ange 20180302.

Har du provat hur den svarar på månader med 30 dagar? Ger den t.ex. 20180431 som svar om du formulerar om din SQL fråga? Jag gissar att det är fel i februari, men mitt tips är att du testar på alla månader som inte har 31 dagar för att se var felet inträffar.

Re: MySQL: Problem med CURDATE()

Postat: 09 apr 2018, 20:18
av franzhaenel
SELECT CURDATE()+3 är inte det samma som dagens datum + 3 dagar utan omvandling av datumet till ett numeriskt värde samt + 3. Säga vad man vill om att det går att göra det utan varning men korrekt addering av datum är på följande sätt:

Kod: Markera allt

mysql> SELECT DATE_ADD(CURDATE(), INTERVAL 3 DAY);
+-------------------------------------+
| DATE_ADD(CURDATE(), INTERVAL 3 DAY) |
+-------------------------------------+
| 2018-04-12                          |
+-------------------------------------+

Som synes hanterar den även februari korrekt ;)

Kod: Markera allt

mysql> SELECT DATE_ADD('2018-02-27', INTERVAL 3 DAY);
+----------------------------------------+
| DATE_ADD('2018-02-27', INTERVAL 3 DAY) |
+----------------------------------------+
| 2018-03-02                             |
+----------------------------------------+