Miten kannattaisi päivämäärä tallentaa tietokantaan? Varcharina?
päivämäärän tallennus
mysql:ään
13930
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Turvaa tilisi vahvistamalla puhelinnumerosi. Voit silloin palauttaa unohtuneen salasanan tekstiviestillä.
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 13
Vanhimmat
Yleensä kannatta käyttää kannan omaa date tyyppiä- MySQL voi käyttää DATE, DATETIME riippuen halutaanko päivän lisäksi aika tallennettua.
Haluaisin nimittäin itse syöttää tuon päivämäärän, eli syötän siis syntymäpäivän muotoa esim. 05.12.2000
Kun nyt laitoin tyypiksi tuon date ja sitten syötin lomakkeesta päivämäärän niin arvoksi tuli 0000-00-00
laita 2000-12-05 siis vuosi-kuukausi-paiva. Tätä voit muotoilla DATE_FORMAT funktiolla kyselyssä.
Niin turhaan tuota päivämäärän muotoa lähtee mihkään muuttelee, vaan jättää sen tietokannan tehtäväksi kuten asia kuuluukin tehdä. Hyvin usein näkee purkka juttuja joissa tuo päivämäärän muunnos on tehty PHP:n puolella vaikka miten.
Siis näin
STR_TO_DATE('05.12.2000', '%d.%m.%Y')
Siis ensinmäiseen kohtaan tulee se päivämäärä minkä haluat lisätä. Toiseen missä muodossa se on, tuon perusteella MySQL muuttaa sen oikeaan muotoon.
Katso tarkemmin http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_str-to-date
Ja sit kun tulostat päivämäärän niin muotoilet sen haluttuun muotoon DATE_FORMAT(pvm sarakkeesi nimi, '%d.%m.%Y')
http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_date-format
Annoin tosiaan DATE tyypin tallenusmuodon. Tulostukseen voi muotoilla ihan niin paljon kuin vain tahtoo.
Sanoit näin "laita 2000-12-05 siis vuosi-kuukausi-paiva." Siis käsket muuttamaan 05.12.2000 tuohon muotoon, tuota nimenomaan ei pidä tehdä. Vaan laittaa tallennuksessa päivämäärä STR_TO_DATE function kautta STR_TO_DATE('05.12.2000', '%d.%m.%Y') jolloin tietokanta ymmärtää tuon.
Eli miten siis saisin tuon tulostuksen siis vielä tulostumaan taulukkoon ns. oikeassa muodossa?
Eli siis tyyliin: 09.12.2000
Kokeilin tuota DATE_FORMAT mutta ei ilmeisesti ainakaan näin mene?:
echo "" . DATE_FORMAT($row['Syntymapaiva'], '%d.%m.%Y') . "";
Niin tuo on SQL ei PHP:tä joten nuo esimerkkini laitat suoraan kyselyysi. Tuo mitä olet tekemässä on yleinen virhe, sillä yleensä järkevintä ja tehokkainta on data muotoilla tietokannan(MySQL) puolella ei PHP:n.
SELECT DATE_FORMAT(Syntymapaiva, '%d.%m.%Y') AS muotoiltu_paivays FROM taulusi
Ja sitten käytät tuota ihan normaalisti, siis $row['muotoiltu_paivays'] sisältää syntymäpäivän muotoiltuna tuohon muotoon.
Mites kun haen tuolta muutakin kuin tuon päivämärään?
Eli mulla on kysely tyyliin ("SELECT * FROM henkilot");
Pitäskö tuossa jotenkin siis vääntää sitten tyyliin?:
("SELECT Etunimi, Sukunimi, Osoite, Paikkakunta, Postinumero, DATE_FORMAT(Syntymapaiva, '%d.%m.%Y')
AS muotoiltu_paivays FROM henkilot");
"Mites kun haen tuolta muutakin kuin tuon päivämärään?"
Ihan normaaliin malliin haet, tuo on vain yksi "sarake" lisää.
"mulla on kysely tyyliin ("SELECT * FROM henkilot");"
SELECT DATE_FORMAT(Syntymapaiva, '%d.%m.%Y'), * FROM henkilot
Noin se menisi, mutta tähteä ei todellakaan kannata käyttää tuommosissa tapauksissa. Vaan luetella ne mitä sarakkeita tarttet vaikka tarvitsisitkin kaikki sarakkeet. Tämä siksi jos joskus myöhemmin muokkaat taulusi rakennetta ja päätätkin lisätä vaikka kuva sarakkeen jossa on kuvan binääri data, niin nuo kyselyt hakee sen vaikka sitä et tartte juuri tuossa sivussa jne.... ongelmia tuosta tähdestä seuraa. Tietokannasta AINA se data mitä todellisuudessa tarttet.
Tähteä käytetään lähinnä vain debuggaus tarkoituksissa (esim halutaan tietää mitä kaikkea kysely palauttaa) ja SQL esimerkeissä kun ei tiedetä kysyjän taulurakennetta.
"Pitäskö tuossa jotenkin siis vääntää sitten tyyliin?:
("SELECT Etunimi, Sukunimi, Osoite, Paikkakunta, Postinumero, DATE_FORMAT(Syntymapaiva, '%d.%m.%Y')
AS muotoiltu_paivays FROM henkilot");"
Juurikin noin, pikkuhuomautuksena että sarakkeiden nimet kannattaa kirjoittaa kokonaan pienellä ja muutenkin kyselyä ei kannata kirjoittaa yhteenpötköön.
Itse kirjoitan yleensä näin (tiedä sit mitenkä tämä foorumi taitaa tabin painalluksen)
SELECT etunimi,
sukunimi,
osoite,
paikkakunta,
postinumero,
DATE_FORMAT(syntymapaiva, '%d.%m.%Y') AS muotoiltu_paivays
FROM henkilot
Ja mitä tuohon sinun taulurakenteesi tulee niin kannattaa opetella normalisoiti. Siis ei toisteta samaa dataa useasti vaan laitetaan ne toiseen tauluun ja liitoksella yhdistetään. Sinulla paikkakunta ja postinumero ovat niitä mitkä on monella samat. Sekä normalisointi helpottaa myöhemminkin asioita, esim jos tiedot muuttuu sekä voit käyttää postinumerot ja paikkakunnan sisältävää taulua muissakin jutuissa eikä tarvitse tehdä sitä uudestaan jne....
Toimii hyvin nyt. Mites tuo normalisointi muuten, tarkoittako se sitä, että jos mulla 10 henkilöä tuolla talletettuna jotka ovat Helsingistä... Niin jos mulla on paikkakunta omassa taulussa niin Helsinki on vain yhteen kertaan datassa kuin muuten se olisi 10:een kertaan?
Mites muuten, täytyykö noita päivämääriä muotoilla PHP:llä, jos haluan etsiä tuolta kaikki tyypit keiden syntymäpäivä on tänään? (Jos siis kirjoitan tuon tyyliin 26.09.2007, enkä niinkuin se on tietokannassa eli 2007-09-26....)
"Mites tuo normalisointi muuten, tarkoittako se sitä, että jos mulla 10 henkilöä tuolla talletettuna jotka ovat Helsingistä... Niin jos mulla on paikkakunta omassa taulussa niin Helsinki on vain yhteen kertaan datassa kuin muuten se olisi 10:een kertaan?"
Esim
postinumerot
postinumero | paikkakunta
33101 | Tampere
00120 | Helsinki
henkilot
id | nimi | postinumero
1 | Testaaja | 33101
2 | Jotakin | 33101
3 | Juujoo | 00100
SELECT *
FROM henkilot AS h
JOIN postinumerot AS p ON h.postinumero = p.postinumero
Juu itse tykkään lyhentää AS:illa nuo taulukon nimet, postinumerohan on yksinöllinen jotenka sitä voidaan käyttää id-tunnuksena. Sekä kannattaa miettiä oliskos osoite tiedotkin hyvä laittaa omaan tauluunsa sillä monilla on lapsia jotka asuvat samassa osoitteessa jne...
"Mites muuten, täytyykö noita päivämääriä muotoilla PHP:llä, jos haluan etsiä tuolta kaikki tyypit keiden syntymäpäivä on tänään?"
Ei tartte.
Tänään synttärit
SELECT *
FROM henkilot
WHERE DATE_FORMAT(syntymapaiva, '%d%m') = DATE_FORMAT(NOW(), '%d%m')
Vertailu tehdään %d%m koska näin vuosilukua ei huomioida, sillä kerran vuodessa synttärit on.
Jos taasen halutaan vain ne keillä syntymapaiva sarakkeessa on tämä vuosi ja päivä niin silloin
SELECT *
FROM henkilot
WHERE syntymapaiva = NOW()
Jos taasen halutaan hakea ne keillä on synttärit tietyllä päivällä niin silloin käytetään STR_TO_DATE hyödyksi.
SELECT *
FROM henkilot
WHERE DATE_FORMAT(syntymapaiva, '%d%m') = DATE_FORMAT(STR_TO_DATE('05.12', '%d.%m'), '%d%m')
Tuossa vuosiluku olisi ihan turha tieto, mut se voi olla jos niin halutaan.
Kannattaa miettiä oliskos ihan päivä ja kuukausi alasvetovalikkona parempi jos halutaan listata tietyt syntymäpäivät. Riippuu mihkä käyttöön tämä tulee toisaaltaan tekstilootaan on nopeampi naputella päivä ja kuukausi.
Mielestäni syntymapaiva sarake olisi ehkä parempa nimetä syntymaaika jos siitä kyse on.