Avatar billede jjdk Nybegynder
29. oktober 2006 - 14:51 Der er 14 kommentarer og
1 løsning

Fejl i MYSQL Syntax efter serverskifte

Hej.
Efter at jeg har skiftet til anden server (one.com), har jeg et enkelt "udtræk", der giver fejl:
Jeg får følgende fejl:

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(CONCAT(start_d, '/', start_m, '/', start_aar), '%d/%m/%Y') > D

Koden ser sådan her ud:

$query = mysql_query("SELECT * FROM kalender_aftale Where elektronisk = '1' AND STR_TO_DATE(CONCAT(start_d, '/', start_m, '/', start_aar), '%d/%m/%Y') > DATE_ADD(now(), INTERVAL -60  DAY) ORDER BY start_aar DESC, start_m DESC, start_d DESC");

De 3 felter "start_d", "Start_m", "start_aar" er alle 3 af typen Int(11) og har hhv. værdier som dato, måned og år.

Udtrækket  virker fint på 2 andre servere?
Avatar billede leif Seniormester
29. oktober 2006 - 18:00 #1
Hvad version af MySQL har du concat er først kommet i en af de nyeste MySQL versioner
Avatar billede leif Seniormester
29. oktober 2006 - 18:03 #2
Jeg får i hvert til noget lign. samme fejl på en anden server med en ældre mysql version
Avatar billede jjdk Nybegynder
29. oktober 2006 - 18:11 #3
Versionen er:
MySQL 4.0.24
Så du har formentlig ret i den kommentar.

Nogen forslag til alternativ kode, som også den gamle version kan håndtere?
Avatar billede pidgeot Nybegynder
29. oktober 2006 - 19:27 #4
Blot til orientering: det er ikke CONCAT der er problemet - det er derimord STR_TO_DATE, da denne først kom i 4.1.1.

Hvad med at udelade den konvertering og så i stedet bare bruge det "rigtige" format, nemlig YYYY-MM-DD? MySQL skulle nok kunne finde ud af det på den måde:

SELECT * FROM kalender_aftale Where elektronisk = '1' AND CONCAT(start_aar, '-', start_m, '-', start_d) > DATE_ADD(now(), INTERVAL -60  DAY) ORDER BY start_aar DESC, start_m DESC, start_d DESC

Dette forudsætter så at måned og dag altid er skrevet med to cifre, ellers skal der lidt mere til - noget i denne stil (dog utestet):

SELECT * FROM kalender_aftale Where elektronisk = '1' AND CONCAT(start_aar, '-', CASE start_m>9 THEN '0' ELSE '' END, start_m, '-', CASE start_d>9 THEN '0' ELSE '' END, start_d) > DATE_ADD(now(), INTERVAL -60  DAY) ORDER BY start_aar DESC, start_m DESC, start_d DESC
Avatar billede jjdk Nybegynder
29. oktober 2006 - 19:44 #5
Pidgeot: Tak for din kommentar. Måned og dag er ikke altid skrevet med 2 cifre - så jeg skal lige have det testet - så vender jeg tilbage.
Avatar billede jjdk Nybegynder
31. oktober 2006 - 20:43 #6
Har prøvet med pidgeot's forslag, men får følgende fejl:

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'THEN '0' ELSE '' END, start_m, '-', CASE start_d>9 THEN '0' ELS
Avatar billede pidgeot Nybegynder
31. oktober 2006 - 22:03 #7
Ah, min fejl - er ikek vant til at arbejde med CASE i SQL, så der manglede lige et ord.

Det må i stedet skulle være følgende:
SELECT * FROM kalender_aftale Where elektronisk = '1' AND CONCAT(start_aar, '-', CASE WHEN start_m>9 THEN '0' ELSE '' END, start_m, '-', CASE WHEN start_d>9 THEN '0' ELSE '' END, start_d) > DATE_ADD(now(), INTERVAL -60  DAY) ORDER BY start_aar DESC, start_m DESC, start_d DESC
Avatar billede jjdk Nybegynder
31. oktober 2006 - 22:25 #8
Tak fordi du giver dig tid til at hjælpe mig:)
Nu virker det næsten, men det lader ikke til at Intervallet ikke virker korrekt.
Jeg har nemlig 3 poster, der ikke kommer med i udtrækket.
Datoerne er: 17-11-2006, 02-12-2006 og 15-12-2006. Det er i øvrigt de eneste poster fra november og december måned. Derudover kommer "gamle" aftaler også med.
Meningen er at den skal vise alle poster med udgangspunkt i dagsdato minus 60 dage svarende til ca. d. 01-09-2006 og fremefter. Altså udtrækket skal vise alle aftaler fra 01-09-2006 og fremefter.

Håber du kan se en løsning, da jeg ikke kan gennemskue det.
Avatar billede pidgeot Nybegynder
01. november 2006 - 07:46 #9
Der må jeg desværre lige melde pas. Den eneste måde jeg kan se det gå galt på er hvis der står noget forkert i et af felterne, eller året er skrevet med 2 cifre (omend det ikke helt forklarer de gamle).

Overvej evt. at skifte det hele ud med et enkelt DATE-felt, det bliver nok nemmere at arbejde med.
Avatar billede jjdk Nybegynder
01. november 2006 - 09:43 #10
Jeg har testet en hel del her til morgen og tjekket lidt:
1. Alle årstal er med 4 cifte
2. Alle datoer eller måneder er 1 eller 2 cifre (ingen foranstillet "0")
3. Jeg har oprettet mange flere poster. Poster med datoer fra 01-10-2006 til 31-12-2006 kommer ikke med i udtrækket. Altså oktober, november og december i 2006 kommer ikke med, men poster fra samme måneder i 2007 kommerr med.
4. Jeg har prøvet at udskifte "DATE_ADD(now(), INTERVAL -60  DAY)" med " '2006-10-15' ". Det er fortsat alle poster der trækkes ud, bortset fra aftaler i måned 10,11 og 12 2006. Samme resultat hvis jeg bruger datoen " '2006-08-08' "

Håber at du vil tjekke 1 gang mere, da jeg ikke ved, hvad jeg ellers skal gøre?

PS. Jeg er godt klar over, at det er nemmere med et enkelt DATE-felt. Men der er tale om et færdig programmeret kalender- og bookingsystem på flere tusinde kodelinjer - det kan jeg slet ikke overskue, at skulle ændre.
Avatar billede jjdk Nybegynder
01. november 2006 - 10:12 #11
Jeg tror jeg har løst det. I din kode bruger du ">". Det skal vel være "<".
Jeg tester og vender tilbage.
Avatar billede jjdk Nybegynder
01. november 2006 - 10:22 #12
Jeg er stadig lidt usikker på koden, men når du i koden sætter et '0', er det så ikke på de datoer/måneder der på 1 cifre.
Jeg vil derfor mene, at koden skal være sådan her for at foranstille '0':

CASE WHEN start_m<=9 THEN '0' ELSE '' END
Avatar billede pidgeot Nybegynder
01. november 2006 - 21:27 #13
Ah, for pokker - jo, selvfølgelig er det sådan det skal være :)

SELECT * FROM kalender_aftale Where elektronisk = '1' AND CONCAT(start_aar, '-', CASE WHEN start_m<=9 THEN '0' ELSE '' END, start_m, '-', CASE WHEN start_d<=9 THEN '0' ELSE '' END, start_d) > DATE_ADD(now(), INTERVAL -60  DAY) ORDER BY start_aar DESC, start_m DESC, start_d DESC
Avatar billede jjdk Nybegynder
02. november 2006 - 11:43 #14
Jamen - din hjælp har nu været rigtig god. Tusind tak for dine input.
Sender du et svar!

PS. Jeg vælger nok at lave et datofelt i MySQL. Jeg behøver jo ikke, at ændre alt kode, da jeg blot i PHP kan sammensætte datoen og smide din i et nyt datofelt i Mysql. Så bliver det noget mere enkelt at lave "Select" fremover.
Avatar billede pidgeot Nybegynder
02. november 2006 - 16:29 #15
Svaret kommer her :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester