Olen tehnyt taulun, jossa timestampilla päivittyy tieto, koska tauluun on lisätty tavaraa. Miten saisin lisättyä tauluun toisen timestampin, jossa olisi toinen päivämäärä tasan kuukauden kuluttua päivitystiedosta? Kyseessä on kirjasto, johon lisätään laina, ja laina-aika alkaa kun tieto lisätään kantaan. Tähän pitäisi liittää laina-ajan päättymispäivä.
Jos tekisin tuon itse, niin jättäisin toisen päivämäärän pois ja korvaisin sen jollain Lainan_kesto_ID:llä tms. joka kertoisi lainan keston. Seuraavalla tyyppisellä haulla hakisin sitten tiedon lainan ajankohdasta ja palautuspäivästä. Koodia rivitetty, että siitä saa helpommin selvää.
SELECT pvm AS Lainattu, IIF(KestoID=1,DATEADD("d",7,pvm), IIF(KestoID=2,DATEADD("d",14,pvm), DATEADD("m",1,pvm))) AS Palautus FROM Lainaukset
IIF on ehtorakenne Accessin SQL:ssä ja DATEADD:llä saat lisättyä päivämäärään haluamasi yksikön. En tiedä käyttämääsi tietokantaa, joten voit joutua korvaamaan IIF:n joko DECODE- (Oracle) tai CASE-rakenteella (Oracle/SQL Server). MySQL:llä käytetää IF:ä. DATEADD:ssä ensin määritetään mitä lisätään (d=date,m=month), kuinka paljon lisätään ja mihin lisätään. Googlella löytyy esimerkkejä.
Mikähän tietokanta kyseessä? BadSourcen ideakin varmasti toimii, mutta tuntuu kyllä vähän vääränlaiselta, kovakoodatulta ratkaisulta. Entäs jos laina uusitaan? Tai halutaan muuttaa vaikka oletuslaina-aikoja?
Eli jos tässä on kyseessä 'lainat'-taulu, niin ihan loogista on tallettaa sinne se eräpäivä. Miten sen teet, se riippuu tietokannasta.
ajv kirjoitti:
BadSourcen ideakin varmasti toimii, mutta tuntuu kyllä vähän vääränlaiselta, kovakoodatulta ratkaisulta.
En tiedä mistä johtui, mutta "kovakoodattu ratkaisu" sai aikaan saman ensireaktion kuin olisit haukkunut äitiäni... =D
Mitä nyt itse olen kirjastoja käyttänyt, niin ei niissä taida kovin paljoa vaihdella nuo laina-ajat viikon, 2 viikon tai kuukauden jaksoista. Ja SQL kysely taitaa aina olla "kovakoodattu ratkaisu"...
ajv kirjoitti:
Entäs jos laina uusitaan?
Meinasin sanoa, että päivittää lainapäivää, mutta sillä menetettäisiin historia-tiedot. Kun nyt noita historia-tietoja aloin miettiä, niin tarvitaanko tietoa milloin laina on uusittu ja kuinka monta kertaa? Silloin pilkkoisin lainauksen kolmeen erilliseen tauluun.
Ensimmäinen taulu sisältää lainattavan tuotteen tiedot joista yksi olisi käyttämäni kestoID, sillä samaa tuotetta lainataan aina sille samalle kestolle, eikä se vaihtele kirjastontädin mielialan, kellonajan, viikonpäivän tai vuodenajan mukaan.
Toinen taulu olisi itse lainaus, jossa olisi vain kolme tietoa: yksilöivä lainaID (AutoNumber-tyyppinen ID), tuoteID ja henkilöID, eli kuka lainaa (neljäs taulu).
Kolmas taulu olisi lainan kesto taulu, jossa olisi myös kolme tietoa: yksilöivä lainauskertaID, lainaID kakkos taulusta ja lainauksen pvm. Kun laina uusitaan, niin kirjataan vain kolmos tauluun uusi rivi, jossa lainaID pysyy samana, mutta pvm ja lainauskertaID päivittyvät. Uusinta-kerrat selviää hakemalla samat lainaID:t miinus yksi.
Jos historia-tiedoilla ei ole merkitystä (merkinnän tietokannasta saa deletoida pois, kun tuote on palautettu), niin päivämäärän päivittämällä hoituu tuo lainan uusinta. Uusi palautuspäivämäärä kun kerran lasketaan siitä lainapäivämäärästä.
Sori, ei ollut tarkoitus loukata ;) SQL yleensä tuppaa olemaan kovakoodattua, mutta voi sitä älyä laittaa sinne tietokannan asiakkaallekkin. Lainaa lisättäessa oletuksena vaikka kenttä, jossa eräpäivänä nykypäivä + 1 kk tuo joustavuutta hommaan.
Itse kuitenkin toteuttaisin asian jotakuinkin tuolla lailla miten asian nyt uudelleen mietit. Mutta jos haetaan yksinkertaista ratkaisua, olen edelleen
Aihe on jo aika vanha, joten et voi enää vastata siihen.