Päivämäärin väli merkkijonosta

Anonyymi-ap

Tietokannassa on päivämäärät merkkijonoina, ei päivämääräkenttinä. Aikoinaan ei ole ajateltu, että joskus pitäisi niiden avulla laskea jotakin.
Miten saisin kätevimmin (mieluiten) php:llä kahden päivämäärän välin, kun VARCHAR-kentissä on esim. 12.3.2021 ja 17.5.2022?

18

271

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi
      • Anonyymi

        MIKSI WINDOWS EI TAJUA TALVIAIKAA!


    • Anonyymi

      Ei toimi. Päivämäärä on väärää muotoa noissa kentissä. On ilmeisesti muokattava niin, että haetaan erikseen vvv, kk ja pv ja sitten saatetaan se tunnistettavaan muotoon?

      • Anonyymi

        Voi jeesus miten tyhmä sinä olet.


      • Anonyymi
        Anonyymi kirjoitti:

        Voi jeesus miten tyhmä sinä olet.

        Ja sinä vielä tyhmempi!


    • Anonyymi

      PHP:stä en tiedä, mutta TCL:llä se menee näin:
      set myDay1 "12.3.2021"
      set myDay2 "17.5.2022"
      set sec1 [clock scan $myDay1 -format {%d.%m.%Y}]
      set sec2 [clock scan $myDay2 -format {%d.%m.%Y}]
      echo [expr $sec2 - $sec1]
      ...

    • Anonyymi

      Tässä törmättiin sellaiseen vastustamattomaan kiusaukseen nostaa Manjaro Linux muiden yläpuolelle, nimittäin BASH SHELL tulkin alaisuudessa kahden päivämäärän välinen aika päivissä selviää tolkuttoman kivuttomasti:

      >>> datediff -i "%d.%m.%Y" "12.3.2021" "17.5.2022" -f %d
      431

      Totta puhuen kyllä datediff -komennon saa asennettua joka ikiseen Linux jakeluun, ellei se kuulu peruskokoonpanoon.

      TULOSTUS YKSIKKÖ
      %d = päivissä
      %w = viikoissa
      %m = kuukausina
      %Y = vuosina
      %H = tunteina
      ....

      t. TURBO URPO

    • Anonyymi

      Siis tietokannassa on varchar-kenttä, jossa on päivämääriä kirjoitettu kysymyksessä esitetyssä muodossa. Ei siis mitään valmiiksi kovakoodattuja arvoja voi käyttää, vaan arvo on otettava tietokannan kentästä. Ei vaan näy toimivan mitkään esimerkit.
      Kentän sisällön voi tulostaa OK, mutta kyse on näiden päivämäärien erotuksesta.

      • Anonyymi

        Eli onko sinun ongelma siinä ettet osaa sijoittaa arvoja muuttujan sisällöksi.

        Tuossa edellä antamani päiväys voidaan sijoittaa muuttujaan näin:
        >>> nyt="17.5.2022";

        Nyt sitten lasketaan erotus muuttujaa hyödyntäen näin:
        >>> datediff -i "%d.%m.%Y" "12.3.2021" $nyt -f %w

        Ja tämähän esimerkki toimii tälläisenaan BASH SHELL tulkin alaisuudessa.

        Joo, vaikuttaa sitä että tavoitteesi on lukea tuntemattomasta tietokannasta päiväys ulos, mainitsit PHP -tulkin, eli onko tarkoitus tuntemattomasta tietokannasta siirtää päiväys PHP -koodilla käsiteltäväksi, jos käytät MySQL -tietokantaa MySQL sisältää kahden päivämäärän välisen erotuksen laskemiseen tietokannan omilla komennoilla:

        SELECT DATEDIFF("2022-5-17", "2021-3-12");
        https://www.w3schools.com/sql/func_mysql_datediff.asp

        Tässä jätän tahallani antamatta mallia MySQL keinoista muuttaa käsiteltävää päiväyksen esitysmuotoa.

        t. TURBO URPO


      • Anonyymi

        Kurkista esimerkki osoitteesta

        https://pastebin.com/vXeaUM0x

        Tein yksinkertaisen esimerkin missä tietokannan taulussa on mainitsemasi tekstipäivät ja ne luetaan muuttujiin, käsitellään teksti päiväykseksi ja lopuksi lasketaan erotus.


      • Anonyymi
        Anonyymi kirjoitti:

        Eli onko sinun ongelma siinä ettet osaa sijoittaa arvoja muuttujan sisällöksi.

        Tuossa edellä antamani päiväys voidaan sijoittaa muuttujaan näin:
        >>> nyt="17.5.2022";

        Nyt sitten lasketaan erotus muuttujaa hyödyntäen näin:
        >>> datediff -i "%d.%m.%Y" "12.3.2021" $nyt -f %w

        Ja tämähän esimerkki toimii tälläisenaan BASH SHELL tulkin alaisuudessa.

        Joo, vaikuttaa sitä että tavoitteesi on lukea tuntemattomasta tietokannasta päiväys ulos, mainitsit PHP -tulkin, eli onko tarkoitus tuntemattomasta tietokannasta siirtää päiväys PHP -koodilla käsiteltäväksi, jos käytät MySQL -tietokantaa MySQL sisältää kahden päivämäärän välisen erotuksen laskemiseen tietokannan omilla komennoilla:

        SELECT DATEDIFF("2022-5-17", "2021-3-12");
        https://www.w3schools.com/sql/func_mysql_datediff.asp

        Tässä jätän tahallani antamatta mallia MySQL keinoista muuttaa käsiteltävää päiväyksen esitysmuotoa.

        t. TURBO URPO

        Samapa tuo vaikka laittaakin tuon formaatinmuunnoksen mukaan, on siinä sittenkin sovittelua sinne tuntemattomaan ympäristöön, eli:

        SELECT DATEDIFF("2022-5-17", "2021-3-12");

        tämä erotus lasketaan muotuilut huomioiden näin:

        SELECT DATEDIFF(DATE_FORMAT("2022-5-17", "%Y.%m.%d"), DATE_FORMAT( "2021-3-12", "%Y.%m.%d"));

        t. TURBO URPO


      • Anonyymi
        Anonyymi kirjoitti:

        Samapa tuo vaikka laittaakin tuon formaatinmuunnoksen mukaan, on siinä sittenkin sovittelua sinne tuntemattomaan ympäristöön, eli:

        SELECT DATEDIFF("2022-5-17", "2021-3-12");

        tämä erotus lasketaan muotuilut huomioiden näin:

        SELECT DATEDIFF(DATE_FORMAT("2022-5-17", "%Y.%m.%d"), DATE_FORMAT( "2021-3-12", "%Y.%m.%d"));

        t. TURBO URPO

        Eli, nyt muotoilu määrää mikä arvo on kussakin sarakkeessa, välimerkit/erotinmerkit menettävät merkityksensä


    • Anonyymi

      Niin, epäselvästi siis kerroin.
      Päivämäärät on luettu tietokannasta muuttujiin
      $row['order_date']
      $row['delivery_date']
      TIetokannassa nämä ovat VARCHAR(35) muotoisessa kentässä ja kirjoitettuna sisältönä esim. 3.1.2019 ja 15.2.2019, siis kaksi eri kenttää.
      Tavoite on saada näiden kenttien välinen aika, esim. $vv vuotta, $kk kuukautta, $ pv päivää.
      Ainoa mitä saan aikaiseksi, on virheilmoituksia.

      $diff = ($row['delivery_date'] - $row['order_date']);
      echo $diff;
      -> Notice: A non well formed numeric value encountered in... vaikkakin antaa jonkinlaisen vastauksen.
      jne.

      • Anonyymi

        Näin se menee. Nälkä kasvaa syödessä. Osoitteessa

        https://pastebin.com/Gyd64nFp

        on meitsin viimeisin versio tähän keissiin. Siitä ideaa muokkaamalla löydät melko varmasti ratkaisuja omiin tarpeisiin.


    • Anonyymi

      Kiitos ja kumarrus, nyt toimi!
      Piti vaan tässä opetella vähän muutakin välillä.

      • Anonyymi

        Tuo pastebin -esimerkki on tarkoituksella tehty isommalla siveltimellä jotta sen idea avautuisi ja olisi helpommin muokattavissa omiin tarpeisiin. Toisin sanoen sen voi tiivistää lyhyemmäksi jos se tulee osaksi jotain toistuvia rutiiniajoja.


    • Anonyymi

      Hyvä oli esimerkki!
      Lisäksi piti huomioida ($regex = preg_match...), että voi olla kentissä myös roskaa.

      • Anonyymi

        Noinhan se aina menee. Ensin luodaan systeemi joka toimii tilanteessa kun x on luku ja y on merkkijono. Sitten huokaistaan helpotuksesta valmiin ratkaisun kanssa ja suunnitellaan systeemi tilanteeseen kun x ei olekaan luku ja/tai y ei olekaan merkkijono 🙂

        Tämä jälkimmäinen vaihe voi olla jopa hankalampi rasti varsinkin jos ei voida enää vaikuttaa siihen miten tietoja on alun perin käsitelty ja tallennettu.

        Mutta, puretaanhan niitä talojakin sillä perusteella että tulisi kalliimmaksi korjailla vanhaa kuin rakentaa perustuksiaan myöten kokonaan uusi.


    Ketjusta on poistettu 2 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Miksi persuilla ei ole firmoja?

      Kuten vasemmisstolaisilla, esim. Sannalla MA\PI. Eikö ole aika erikoista?
      Maailman menoa
      82
      7086
    2. Persut hommasivat Suomeen 35 000 pientä lasta v. 2015

      Onko Riikka Purra nyt tavoittelemassa tätä samaa historiallista persujen utopiaa? Purram kaksinaamaisessa pelissä vaadit
      Maailman menoa
      26
      7053
    3. Purran tuhoja tuskin saadaan koskaan korjatuksikaan

      Purra on aiheuttanut Suomen taloudelle karmaisevat tuhot. Sen lisäksi Purra on ajanut myös suuren osan Suomen kansasta k
      Maailman menoa
      108
      6157
    4. Persujen kaksoisstandardit: Räsäsen uhkailu paha, Virran uhkailu hyvä

      Tässä taas nähdään kuinka kaksinaamaista porukkaa persut ovat. Mitäs persut tähän?
      Maailman menoa
      45
      5394
    5. Miksette persut irtisanoudu Kirkin lausunnoista?

      Kirkhän muun muassa vaati raiskattuja naisia pidättäytymään abortista ja vaimoja alistumaan aviomiestensä tahtoon. Mik
      Maailman menoa
      84
      5228
    6. Demarikultin uhri kertoo

      Demarikultin uhri kertoo: “En saanut mennä edes suihkuun ilman lupaa” – Seksuaalisen hyväksikäytön uhri kertoo vuosistaa
      Maailman menoa
      63
      5185
    7. Miksi vasemmistolaiset eivät omista yhtään firmaa?

      Vasemmistolaiset eivät omista yhtään firmaa joka työllistäisi ihmisiä. Miksi? No siksi, että jos vasemmistolainen perus
      Maailman menoa
      40
      5098
    8. Sanna valittiin Euroopan huonoimmaksi pääministeriksi

      Sannan kaudella Suomi oli ainut maa missä bkt laski. Kannattaa huomata, että luvut valitsi Sannan huonoimmaksi. Ihmiset
      Maailman menoa
      27
      4585
    9. Purran vuoro kiihoittua Lepomäen sääristä

      "Ulkoministeri Elina sanoo, ettei muuta pukeutumistaan sen mukaan, kenet tapaa, ja että hän ei suostuisi peittämään kasv
      Maailman menoa
      16
      3467
    10. Vasemmistolaiset paskat eivät nousseet seisomaan kun Akaan kaupunginvaltuusto

      vietti hiljaisen hetken Charlie Kirkin muistoksi https://www.aamulehti.fi/uutiset/art-2000011523016.html
      Maailman menoa
      300
      3380
    Aihe