Just nu i M3-nätverket
Gå till innehåll

sql-hjälp


ulrikajosefsson

Rekommendera Poster

ulrikajosefsson

Jag har en mysql-db med evenemang. Kolumnerna e_year (år), e_month (månad), e_day (dag) samt eventId . Nu vill jag välja ut de evenemang som är "större" än idag, alltså bara de som inte har inträffat.

 

Så här ser min nuvarande query ut:

 

select * from events where e_year >= '$thisYear' && e_month >= '$thisMonth'

 

problemet är att jag då får de som redan har hänt i denna månad, eftersom jag inte har med dagen. Lägger jag till && e_day >= '$thisDay' blir det också knas.

 

/ulrikajosefsson

 

Länk till kommentar
Dela på andra webbplatser

Använd datatypen date istället för att dela upp det.

 

select * from events where eventDate > current_date

 

Om du behöver plocka ut år/månad/dag för sig så finns det funktioner för det.

 

Länk till kommentar
Dela på andra webbplatser

Magnus Ahlkvist

Men det är ju knappast ett råd som är giltigt om det nu faktiskt är så att han har det uppdelat (vilket det faktiskt ofta finns mycket bra skäl för, om inte annat så prestandaskäl).

 

Men man kan bygga ihop ett datum ur de tre, vilket ska se ut YYYYMMDD för att vara giltigt oavsett codepage (har för mig att detta gäller för alla DBMS, och inte är SQL Server-specifikt (som är vad jag egentligen kan bäst)).

Vet inte hur man kan tänka sig att man bygger ihop det med PHP (som det verkar som att anropet kommer ifrån), men i ASP kan man göra:

 

year & right("0" & month,2) & right("0" & day,2)

 

SQL ser då ut (i pseudokod eftersom jag inte kan PHP):

SELECT * FROM events where year & right("0" & month,2) & right("0" & day,2) > current_date

 

Hoppas att det hjälper något..

 

 

--

En röst talade till mig och sade:

”Le och var glad, ty det kunde vara värre”.

Så jag log, och jag var glad.

Och det blev värre.

 

Länk till kommentar
Dela på andra webbplatser

ulrikajosefsson

japp det är php det handlar om. Och att slå ihop år, månad och dag till en kolumn är inte aktuellt.

Ska testa lite, har inte träffat på det här sättet tidigare.

 

/ulrikajosefsson

 

Länk till kommentar
Dela på andra webbplatser

Magnus Ahlkvist

En förklaring till varför jag använder VBScripts RIGHT-funktion:

Eftersom en datumkolumn är YYYYMMDD så måste man se till att månad och dag blir två tecken långa, vilket de inte är januari-september och den 1:a till 9:e. Därför tar jag de två "högraste" tecknen i "0" konkatenerat med månad respektive dag, vilket ger "01" för "1" och "11" för "11", osv.

Antar att det finns antingen Right's motsvarighet i PHP, eller en motsvarighet till Mid-funktionen (Substring).

Bygg alltså ihop en variabel i PHP först, som är en åttaställig sträng, som du sen slänger in i SQL-strängen enligt "SELECT * FROM events WHERE current_date < $variabeln"

 

 

--

En röst talade till mig och sade:

”Le och var glad, ty det kunde vara värre”.

Så jag log, och jag var glad.

Och det blev värre.

 

Länk till kommentar
Dela på andra webbplatser

Magnus Ahlkvist

Fel av mig upptäckte jag just, så kan man inte göra. Det är MySQL som måste stödja de stränghanteringsfunktionerna, och de måste byggas ihop av MySQL, annars blir det ju faktiskt så att man måste loopa igenom alla poster i tabellen och jämföra.

Så (förutsatt att det finns en right-funktion i MySQL):

 

select * from events where current_date< year + right('0' + cast(month as varchar(2)),2) + right('0' + cast(day as varchar(2)),2)

 

 

--

En röst talade till mig och sade:

”Le och var glad, ty det kunde vara värre”.

Så jag log, och jag var glad.

Och det blev värre.

 

Länk till kommentar
Dela på andra webbplatser

ulrikajosefsson

Jo när jag tänkte efter en extra gång kom jag på att det nog inte skulle gå, ska leta om det finns en right-funktion...

Tack i alla fall

 

 

Länk till kommentar
Dela på andra webbplatser

ulrikajosefsson

Nu har jag lösningen. När jag väl kom på hur jag skulle tänka (med hjälp från Magnus) var det inte så svårt. Fram med mysql-manualen och leta. Så här blev frågan till slut:

 

"SELECT eid, e_year, e_month, e_day, heading FROM events WHERE CURDATE() + 0 <= CONCAT(e_year, LPAD(e_month,2,0), LPAD(e_day,2,0)) order by e_year asc, e_month asc, e_day asc limit 5"

 

/ulrikajosefsson

 

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...