Olen tehnyt projektia jossa syötän päivämäärän tietokantaan muodossa pp.kk.vvvv (esim. 20.04.2009) (varchar(10)). Nyt kun haluaisin tehdä yhden ominaisuuden lisää, niin pitäisi saada päivämäärät menemään järjestyksessä ja tämähän ei tuo varcharrin kanssa onnistu. Miten pystyn siis muokkaamaan tietokantaa niin, että se osaisi järjestää suoraan nuo päivämäärät tuossa muodossa, vai pitääkö tähän uuten ominaisuuteen koodata joku kommervenkki jolla nuo sitten järjestetään oikein?
Ehkäpä kannattaa käyttää suoraan DATE tyylistä kenttää, koska silloin kanta osaa suoraan järjestellä tulokset oikein. Tuskin nimittäin keksit yhtään syytä, miksi kentän tyyppinä olisi VARCHAR. Toivottavasti rivejä ei ole kovin montaa kappaletta, koska muuntaminen kovin hidasta yleensä.
Usein kannattaa huolestua, jos joutuu kysymään jotakin kommervenkkiä, koska luultavammin kyseiseen toimintoon on olemassa helppo ratkaisu.
Eipä voi kuin ihmetellä, minkä ihmeen takia olet tallentanut päivämäärät noin etkä DATE- tai DATETIME-tyyppiin. Jos kyseessä on tosiaan päivämääräkenttä, kannattaa muuttaa se DATE-tyyppiseksi.
Jos välttämättä haluat pitää sen tuollaisena, voit tietenkin tehdä pitkän ja hitaan vertailun, jossa SUBSTRING-funktiolla erottelet päivämäärästä vuoden, kuukauden ja päivän. Itse vertailuhan on varsinaisesti seuraava:
y1 < y2 OR (y1 = y2 AND (m1 < m2 OR (m1 = m2 AND d1 <= d2)))
Tässä vain joka termistä tulee erillinen funktiokutsu, esim. y1 = SUBSTRING(pvm1, 7, 4).
Syy varcharin käyttämiseen on puhtaasti siinä, että olen liian laiska muuttamaan aina tuota "yyyy-mm-dd" toistepäin enkä ikinä muista kumpi tuossa jenkkiversiossa tulee ensin, päivä vai kuukausi. Muutenkin tämä projektin aikataulu on vain pariviikkoa niin ajattelin ensin tehdä toimivaksi ja vasta jälkeenpäin sitten järkevämmäksi, ettei tule jumitettua jossain tietyssä kohtaa, jonka voisi tehdä nopeammin.
Vaikka tietysti tuon date-formaatin saa helposti muutettua tuohon käyttämääni formaattiin yhdellä funktiolla, mutta... Ehkäpä olen vain tyhmä :(
Noh, sain sen tälläsellä purkalla toimiin.
/* date on muotoa pp.kk.vvvv */ SELECT DATE(CONCAT(SUBSTR(date, 7, 4), "-", SUBSTR(date, 4, 2), "-", SUBSTR(date, 1, 2))) AS pvm FROM taulu ORDER BY pvm ASC;
Kyseessä ei ole "jenkkiversio", vaan Yhdysvalloissa kirjoitettaisiin epäloogisesti mm/dd/yy. SQL:n muoto "YYYY-mm-dd HH:mm:ss" on standardoitu ja kansainvälisesti ymmärrettävämpi. Sen loogisiin ominaisuuksiin kuuluu, että osat ovat suurimmasta pienimpään, jolloin päivämäärien aakkosjärjestys ja aikajärjestys ovat kätevästi samat.
Nyt kannattaisi varmaankin kääntää tuolla koodillasi päivämäärät DATE-muotoon ihan tietokannassa. Järkevintä on yleensä käyttää standardimuotoa aivan viime hetkille (tulostukseen) asti.
UPDATE taulu SET pvm = CONCAT(SUBSTR(pvm, 7, 4), "-", SUBSTR(pvm, 4, 2), "-", SUBSTR(pvm, 1, 2)); ALTER TABLE taulu MODIFY COLUMN pvm DATE;
vvvv-kk-pp on myös ISO 8601 standardin mukainen päivämäärämuoto. Kaikissa järkevissä maissa käytetään tuota (esimerkiksi Ruotsissa)
Aihe on jo aika vanha, joten et voi enää vastata siihen.