päivämäärän tallennus

Miten kannattaisi päivämäärä tallentaa tietokantaan? Varcharina?
13930
Äänestä

Muut lukivat myös

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.

Äänestä
  • 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

    Äänestä

  • ihan noin :/ kirjoitti:

    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ä.

    Äänestä

  • teuro kirjoitti:

    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

    Äänestä

  • Jejeje4 kirjoitti:

    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.

    Äänestä

  • teuro kirjoitti:

    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.

    Äänestä

  • Jejeje4 kirjoitti:

    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

    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') . "";

    Äänestä

  • Onnistuisi...? kirjoitti:

    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.

    Äänestä

  • Jejeje4 kirjoitti:

    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");

    Äänestä

  • selkeni, mutta... kirjoitti:

    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.

    Äänestä

  • Jejeje4 kirjoitti:

    "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....

    Äänestä

  • Jejeje4 kirjoitti:

    "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....)

    Äänestä

  • Kiitän...=) kirjoitti:

    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.

    Äänestä

Kommentoi aloitusta


mysql:ään kirjoitti:

Miten kannattaisi päivämäärä tallentaa tietokantaan? Varcharina?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu