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

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?
18368
Äänestä

Muut lukivat myös

Vastaukset 18

Vanhimmat
  • MIKSI WINDOWS EI TAJUA TALVIAIKAA!

    Äänestä

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?

Äänestä
  • Voi jeesus miten tyhmä sinä olet.

    Äänestä

  • Anonyymi00003 kirjoitti:

    Voi jeesus miten tyhmä sinä olet.

    Ja sinä vielä tyhmempi!

    Äänestä

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

Äänestä

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

Äänestä

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.

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

    Äänestä

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

    Äänestä

  • Anonyymi00006 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

    Äänestä

  • Anonyymi00006 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ä

    Äänestä

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.

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

    Äänestä

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

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

    Äänestä

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

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

    Äänestä

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

Kommentoi aloitusta


Anonyymi-ap kirjoitti:

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?

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