[PHP & MySQL] Column 'thetimestamp' cannot be null

Pagina: 1
Acties:

Onderwerpen


  • Liqued
  • Registratie: Februari 2001
  • Laatst online: 06-08 15:21
Ik loop opeens tegen een vaag probleem aan. Ik heb een SQL query in php die het altijd prima gegaan heeft en nu opeens de foutmelding
Column 'thetimestamp' cannot be null
. Voor zover ik weet is er niks veranderd en ik snap de foutmelding dan ook niet. Er zijn namelijk wel degelijk logs met de timestamp vandaag.

Dit is de query:
PHP:
1
2
3
$query = "SELECT * FROM log WHERE user_id=" . $info['id'] . " 
    AND thetimestamp BETWEEN DATE_SUB( CURDATE( )+1, INTERVAL 
    1 DAY ) AND CURDATE()+1";


Wat is het probleem?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Precies wat de foutmelding aangeeft. Je probleem zit dan ook geheid niet in de SELECT maar in een INSERT/UPDATE.

DATE_SUB( CURDATE( )+1, INTERVAL 1 DAY ) geeft NULL terug :X Geen idee of dat een MySQL bug is of by design of whatever.

[ Voor 21% gewijzigd door RobIII op 30-09-2009 15:52 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Liqued
  • Registratie: Februari 2001
  • Laatst online: 06-08 15:21
Maar waarom is dat null? Ik snap het niet. Er staat in elke record een timestamp ingevuld.

  • Liqued
  • Registratie: Februari 2001
  • Laatst online: 06-08 15:21
CurDate() + 1 geeft NULL terug.
Dat is vreemd. Het script heeft al weken gewerkt en ik heb het niet aangepast. Wat is er veranderd?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Liqued schreef op woensdag 30 september 2009 @ 15:52:
[...]
Dat is vreemd. Het script heeft al weken gewerkt en ik heb het niet aangepast. Wat is er veranderd?
Dat we nu op 't eind van de maand zitten. En CurDate() +1 geeft, klaarblijkelijk, niet 1 okt 2009 terug maar 31 september 2009 :X
Mind you, ik ben niet erg bekend met MySQL en al helemaal niet met de datetime functies van MySQL noch het feit of je zomaar 1 bij CurDate() mag optellen, maar klaarblijkelijk gaat het daar mis. Kwestie van debuggen.

[ Voor 26% gewijzigd door RobIII op 30-09-2009 15:56 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Liqued
  • Registratie: Februari 2001
  • Laatst online: 06-08 15:21
haha. dat is een goede. Eens even kijken hoe ik dat moet gaan oplossen.

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 19:17

MueR

Admin Tweakers Discord

is niet lief

Waarom gebruik je uberhaupt CURDATE()+1 ? DATE_ADD en DATE_SUB werken toch prima (die zijn er immers voor gemaakt)?

edit:
En waarom DATE_SUB(CURDATE() + 1, INTERVAL 1 DAY) ? Dat is net zo iets als 2 + 1 - 1 opschrijven, waar 2 ook volstaat?

[ Voor 35% gewijzigd door MueR op 30-09-2009 15:59 ]

Anyone who gets in between me and my morning coffee should be insecure.


  • Phoenix1337
  • Registratie: April 2009
  • Laatst online: 14:07
Dat mag dus niet, en daar is die INTERVAL 1 DAY ook voor. In zit geval wanneer de dag niet gelijk aan de laatste dag van de maand is, telt hij er 2 bij op.

Uit de manual:
"mysql> SELECT CURDATE();
-> '2008-06-13'
mysql> SELECT CURDATE() + 0;
-> 20080613
"
oftewel je bedoeld die tweede versie. Of je moet interval gebruiken, maar niet zoals het er nu staat.

  • japaveh
  • Registratie: Maart 2003
  • Laatst online: 15-09 17:43

japaveh

Jield BV

Mysql heeft inderdaad wel een grappige datumtelling.

mysql> SELECT CURDATE()+2;
+-------------+
| CURDATE()+2 |
+-------------+
|    20090932 |
+-------------+
1 row in set (0.00 sec)


INTERVAL 2 DAY geeft wel het gewenste resultaat;
mysql> SELECT CURDATE() + INTERVAL 2 DAY;
+----------------------------+
| CURDATE() + INTERVAL 2 DAY |
+----------------------------+
| 2009-10-02                 |
+----------------------------+
1 row in set (0.00 sec)

[ Voor 41% gewijzigd door japaveh op 30-09-2009 16:02 ]

Solo Database: Online electronic logbook and database system for research applications


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
MueR schreef op woensdag 30 september 2009 @ 15:58:
Waarom gebruik je uberhaupt CURDATE()+1 ? DATE_ADD en DATE_SUB werken toch prima (die zijn er immers voor gemaakt)?
Inderdaad. Als er een DATE_SUB bestaat moet er toch ergens een lampje gaan branden denk ik dan maar :P

offtopic:
Wel grappig dat er een DATE_SUB is. MySQL gebruikers snappen klaarblijkelijk niet dat een DATE_ADD met een negatieve waarde (-1) overeenkomt met een DATE_SUB :P * RobIII rent.
(Viel me gewoon op; MSSQL kent (AFAIK) alleen DATEADD, Oracle AFAIK ook).
MueR schreef op woensdag 30 september 2009 @ 15:58:
edit:
En waarom DATE_SUB(CURDATE() + 1, INTERVAL 1 DAY) ? Dat is net zo iets als 2 + 1 - 1 opschrijven, waar 2 ook volstaat?
En ook hierbij krabte ik me achter de oren, maar ging er van uit dat 't misschien een variabele had moeten zijn ofzo.
japaveh schreef op woensdag 30 september 2009 @ 16:01:
Mysql heeft inderdaad wel een grappige datumtelling.
Ik zou idd op z'n minst een foutmelding verwachten. Maar het advies is dan ook: als er datetime functies aanwezig zijn: gebruiken :Y) Nu zeg je wel +1 maar... plus 1 wat? Seconde? Dag? Jaar? Ik vind 't sowieso altijd ranzig, dit soort constructies.

[ Voor 20% gewijzigd door RobIII op 30-09-2009 16:05 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • MueR
  • Registratie: Januari 2004
  • Laatst online: 19:17

MueR

Admin Tweakers Discord

is niet lief

RobIII schreef op woensdag 30 september 2009 @ 16:01:
offtopic:
Wel grappig dat er een DATE_SUB is. MySQL gebruikers snappen klaarblijkelijk niet dat een DATE_ADD met een negatieve waarde (-1) overeenkomt met een DATE_SUB :P * RobIII rent.
(Viel me gewoon op; MSSQL kent (AFAIK) alleen DATEADD, Oracle AFAIK ook).
MySQL kent feitelijk ook alleen maar DATE_ADD. DATE_SUB is een wrapper die DATE_ADD aanroept met negatieve waarde ;)

Anyone who gets in between me and my morning coffee should be insecure.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

japaveh schreef op woensdag 30 september 2009 @ 16:01:
Mysql heeft inderdaad wel een grappige datumtelling.

mysql> SELECT CURDATE()+2;
+-------------+
| CURDATE()+2 |
+-------------+
|    20090932 |
+-------------+
1 row in set (0.00 sec)
Het hele probleem is dat zodra je ermee gaat rekenen alsof 't een integer is, hij ook daadwerkelijk de datum als integer interpreteert. Het type van CURDATE() + 1 is geen datum, maar gewoon een int (convert CURDATE() naar int, en tel er 1 bij op). Door de BETWEEN probeert hij het vervolgens weer naar datum te converteren, wat natuurlijk niet lukt omdat de notatie ongeldig is.

Ik weet niet wat voor type thetimestamp precies is, maar als het een int is zou ik gewoon BETWEEN NOW()+0 AND NOW()+1 doen, en anders BETWEEN NOW() AND NOW() + INTERVAL 1 DAY

.edit: ja dat mag ook ;)

Overigens vind ik de error raar. Hij zou gewoon een lege resultset moeten geven, of thetimestamp nou wel of niet NULL mag zijn.

[ Voor 41% gewijzigd door .oisyn op 30-09-2009 17:12 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • jbdeiman
  • Registratie: September 2008
  • Laatst online: 18:00
CURDATE() + INTERVAL 1 DAYS

Wat doet dit dan in jou query?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat geeft wel een datum terug.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
jbdeiman schreef op woensdag 30 september 2009 @ 17:06:
CURDATE() + INTERVAL 1 DAYS

Wat doet dit dan in jou query?
Er zijn versies van MySQL die niet met het meervoud DAYS uit de voeten kunnen, gebruik dan liever het enkelvoud DAY. Dat werkt ook met meerdere dagen, dat geeft geen (nieuwe) problemen.
Pagina: 1