Toon posts:

[SQL] Like query i.c.m SQL functie werkt niet

Pagina: 1
Acties:
  • 274 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik probeer de volgende query uit te voeren:

code:
1
SELECT max(id)+1 FROM debcre where id LIKE YEAR('02-02-03')+"%"


Maar krijg een NULL value terug.

Indien ik probeer de volgende query uit te voeren krijg ik wel een value terug:

code:
1
SELECT max(id)+1 FROM debcre where id LIKE "2002%"


Oftewel hier begrijp ik uit dat het niet mogelijk is om een YEAR() functie uit te voeren in combinatie met LIKE.

Wie heeft een oplossing voor dit probleem om dit toch voorelkaar te krijgen.

De bedoeling is namelijk dat er klantnummers(ID) in de debcre tabel staan en de ID word indien er een nieuwe klant is 1 verhoogt.

In de table staat dus dit:

--==[DEBCRE]==--

[ID] [NAME]
2002001 Pietje Puk
2002002 Bram Klopperburg

Nu indien er een nieuwe klant komt wil ik die 1ste query uitvoeren zodat er als resultaat 2002003 uitkomt.

Hopelijk heeft iemand een oplossing om dit toch door middel van een query op te lossen, als het niet anders kan dan moet ik dat maar met PHP oplossen maar het liefst zou ik dit in een query al opgelost willen hebben.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Wat ben je in godsnaam van plan ermee :?
Als je een datum hebt en die in een bepaalde periode wilt hebben kan je toch veel beter met ranges en dergelijke werken?
Of nog beter:
where YEAR(date_field) = 2002 ...

Waarom gebruik je niet gewoon een auto increment integer veld trouwens?
Moet het perse met die 2002 beginnen? Kan je niet beter zowel een autoincrementing integer-id gebruiken en daarnaast de registratie datum?

  • Theguide
  • Registratie: December 2000
  • Laatst online: 26-06-2025
Welke database gebruik je?. MySQL heeft namelijk een datumnotatie als: 2003-01-20. Ik kan me zo voorstellen dat als je MySQL gebruikt dat hij de YEAR ('02-02-03') dan niet snapt.

Fuck me if I'm wrong, but isn't your name Gretchen?


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Theguide schreef op 24 januari 2003 @ 11:49:
Welke database gebruik je?. MySQL heeft namelijk een datumnotatie als: 2003-01-20. Ik kan me zo voorstellen dat als je MySQL gebruikt dat hij de YEAR ('02-02-03') dan niet snapt.

Dat heeft er weinig mee te maken, er wordt een integer veld (of blijkbaar een char veld, vanwege de like) gebruikt in date-functies...
En dat is toch niet echt de bedoeling.

Btw, als ie altijd dezelfde vorm heeft, waarom dan niet
select max(id)+1 from debcre where id between 2002000 and 2003000 :?

Alhoewel ik een auto genererend id toch mooier vind meestal ;)

Verwijderd

Topicstarter
ACM schreef op 24 January 2003 @ 11:46:
Wat ben je in godsnaam van plan ermee :?
Als je een datum hebt en die in een bepaalde periode wilt hebben kan je toch veel beter met ranges en dergelijke werken?
Of nog beter:
where YEAR(date_field) = 2002 ...

Waarom gebruik je niet gewoon een auto increment integer veld trouwens?
Moet het perse met die 2002 beginnen? Kan je niet beter zowel een autoincrementing integer-id gebruiken en daarnaast de registratie datum?
Het klantnummer word automatisch gegenereerd icm met het jaar. Dus als het een nieuw jaar is begint het nummer 2004001 met autonummering kan je dat niet aangeven.

2 kolommen heeft ook geen zin met 1 van het jaar en ander van nummering omdat die nummering in het nieuwe jaar weer op 001 moet staan en moet niet worden doorgenummerd.

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 25-08 14:38

OZ-Gump

terug van weggeweest

Het is zowieso altijd heel gevaarlijk om je jaarnotatie in twee karakters te doen. Een tijdje geleden hadden ze daar een aparte naam voor: milleniumprobleem ofzo.
Oftewel: VIER POSITIES VOOR JAARTALLEN GEBRUIKEN! Verder is het wel degelijk mogelijk, maar wellicht is het verstandiger om eerst de uitkomst van de year-functie in een variabele te zetten en die vervolgens aan te roepen in je LIKE statement.

My personal website


  • Freee!!
  • Registratie: December 2002
  • Laatst online: 25-08 16:25

Freee!!

Trotse papa van Toon en Len!

Verwijderd schreef op 24 January 2003 @ 11:56:
[...]
Het klantnummer word automatisch gegenereerd icm met het jaar. Dus als het een nieuw jaar is begint het nummer 2004001 met autonummering kan je dat niet aangeven.

2 kolommen heeft ook geen zin met 1 van het jaar en ander van nummering omdat die nummering in het nieuwe jaar weer op 001 moet staan en moet niet worden doorgenummerd.
Met een correcte opzet van de database moet het zonder meer in 2 kolommen kunnen, gebruiken wij op het werk ook voor verschillende zaken.

The problem with common sense is that sense never ain't common - From the notebooks of Lazarus Long

GoT voor Behoud der Nederlandschen Taal [GvBdNT


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

OZ-Gump schreef op 24 January 2003 @ 11:58:
Het is zowieso altijd heel gevaarlijk om je jaarnotatie in twee karakters te doen. Een tijdje geleden hadden ze daar een aparte naam voor: milleniumprobleem ofzo.
Oftewel: VIER POSITIES VOOR JAARTALLEN GEBRUIKEN! Verder is het wel degelijk mogelijk, maar wellicht is het verstandiger om eerst de uitkomst van de year-functie in een variabele te zetten en die vervolgens aan te roepen in je LIKE statement.

Als je zijn voorbeeld data es bekijkt :?
En dan gaat nadenken voor je wat roept :P
Verwijderd schreef op 24 January 2003 @ 11:56:
Het klantnummer word automatisch gegenereerd icm met het jaar. Dus als het een nieuw jaar is begint het nummer 2004001 met autonummering kan je dat niet aangeven.

2 kolommen heeft ook geen zin met 1 van het jaar en ander van nummering omdat die nummering in het nieuwe jaar weer op 001 moet staan en moet niet worden doorgenummerd.
Als je een "Echte" database hebt (mssql, oracle, db2, sybase, postgresql, oid) dan kan je dmv triggers afdwingen dat er automatisch een goed samengesteld id wordt gegenereerd.
Dus met zowel een jaar-veld als met een autoincrementing doornummer-getal per jaar.

Maar het id dat je klant ziet hoeft nog niet het id dat er in je database aan je klant hangt te zijn hoor ;)
Alhoewel dat doorgaans wel makkelijker is.

[ Voor 42% gewijzigd door ACM op 24-01-2003 12:03 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 25-08 14:38

OZ-Gump

terug van weggeweest

ACM schreef op 24 januari 2003 @ 12:01:

[...]

Als je zijn voorbeeld data es bekijkt :?
En dan gaat nadenken voor je wat roept :P
Dat doe ik: hij zegt year('02-02-03')
En da's volgens mij niet een 4-positie notatie voor jaartallen, of wel?

Misschien is het namelijk wel zo dat als je year zo aanroept, dat dan je antwoord ook wel in 2 posities komt? Maar dat weet ik dan weer niet zeker...

[ Voor 22% gewijzigd door OZ-Gump op 24-01-2003 12:05 ]

My personal website


Verwijderd

Topicstarter
OZ-Gump schreef op 24 januari 2003 @ 11:58:
Het is zowieso altijd heel gevaarlijk om je jaarnotatie in twee karakters te doen. Een tijdje geleden hadden ze daar een aparte naam voor: milleniumprobleem ofzo.
Oftewel: VIER POSITIES VOOR JAARTALLEN GEBRUIKEN! Verder is het wel degelijk mogelijk, maar wellicht is het verstandiger om eerst de uitkomst van de year-functie in een variabele te zetten en die vervolgens aan te roepen in je LIKE statement.
Het is ook niet de bedoeling die notatie te gebruiken maar dit had ik als voorbeeld effies neergezet omdat ik daar eigenlijk de functie now() tussen ga gebruiken.

Daarnaast heb ik ook getracht om dit te doen:

code:
1
SELECT max(id)+1 AS last_id, YEAR('2003-02-03') AS y FROM debcre WHERE id LIKE y+"%"


Dat werkt ook niet en geeft ie een unknow column 'y' aan.

Verwijderd

Topicstarter
ACM schreef op 24 januari 2003 @ 11:53:

[...]

Dat heeft er weinig mee te maken, er wordt een integer veld (of blijkbaar een char veld, vanwege de like) gebruikt in date-functies...
En dat is toch niet echt de bedoeling.

Btw, als ie altijd dezelfde vorm heeft, waarom dan niet
select max(id)+1 from debcre where id between 2002000 and 2003000 :?

Alhoewel ik een auto genererend id toch mooier vind meestal ;)
Helaas werkt dit weer niet:

code:
1
SELECT max(id)+1 FROM debcre where id between YEAR('2002-01-01')+000 and YEAR('2003-01-01')+000


maar wel dit

code:
1
SELECT max(id)+1 FROM debcre where id between YEAR('2002-01-01')+000 and 2003000

[ Voor 3% gewijzigd door Verwijderd op 24-01-2003 12:14 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 25-08 14:38

OZ-Gump

terug van weggeweest

OK, mogelijke oplossing: maak een query die alleen het jaartal uitrekent, als volgt:
code:
1
SELECT Year(Now())&"%" AS jaar

Vervolgens gebruik je die query om het gevonden jaartal in je uiteindelijke query te kunnen gebruiken, ongeveer zo:
code:
1
SELECT Artikel.* FROM tstQry, Artikel WHERE Artikel.Artikel Like [tstQry].[jaar]
Ik heb het hier getest, en dat lijkt toch op zeker te werken...

My personal website


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 24 januari 2003 @ 12:14:
Helaas werkt dit weer niet:

code:
1
SELECT max(id)+1 FROM debcre where id between YEAR('2002-01-01')+000 and YEAR('2003-01-01')+000
2002 + 000 = 2002 :)

Hoe kom je uberhaupt aan die datums?
Als je dat er met een client-app in zet kan je net zo goed 2002000 en 2003000 erin zetten natuurlijk :)
Als je "YEAR(current_date)" oid doet dan moet je dat als een string concatteneren en daarna naar int casten (als je db dat expliciet nodig vindt)

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

moet je ook geen date functie gebruiken op een string dat geen datum voorstelt. Dan gebruik je netjes de string functies om het jaar eruit te filteren en dan werk je met die substring verder.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
ACM schreef op 24 January 2003 @ 12:23:
[...]

2002 + 000 = 2002 :)

Hoe kom je uberhaupt aan die datums?
Als je dat er met een client-app in zet kan je net zo goed 2002000 en 2003000 erin zetten natuurlijk :)
Als je "YEAR(current_date)" oid doet dan moet je dat als een string concatteneren en daarna naar int casten (als je db dat expliciet nodig vindt)
Je theorie klopt helemaal, heb daar helemaal niet bij stilgestaan dat daar uiteraard gewoon 2002 uitkomt |:( |:(

Naar inderdaad zoeken om een int naar string te casten kwam ik deze functie tegen op MySql namelijk "CONCAT".

Deze functie converteerd nummers naar strings waardoor het wel lukte in de mysql query.

De query ziet er nu zo uit:

code:
1
SELECT max(id)+1 FROM debcre where id LIKE CONCAT(YEAR('2002-02-03'),"%")


THANKS!!!!

_/-\o_ _/-\o_
Pagina: 1