En tricky sql :)
3 naročniki
3 naročniki
Npr. vodimo evidenco gostovanj.
V tabeli je v enem stolpcu zapisan obračunski interval v mesecih (npr. plačuje se vsake 3 mesece)
v drugem stolpcu je pa datum pričetka gostovanja (npr. 1.4.2011)
imestranke (VARCHAR)
interval (INT)
datumzacetka (DATE)
Kako z mysqlom dobiti seznam vseh, ki bodo v roku 5 dni morali plačati gostovanje?
Sliši se simpl, vendar mi povzroča rahle preglavice :)
Jutri bom nadaljeval s tem, upam pa, da do takrat že dobim kak hint oz. rešitev :)
3 odgovori
SELECT
ime_stranke
FROM
tabela
WHERE
DATE_ADD(datum_zacetka, INTERVAL `interval` MONTH) < DATE_ADD(CURDATE(), INTERVAL 5 DAY);
Je pa to še kar butasta poizvedba, povsem neoptimizirana in jo je s podatki v tej obliki povsem nemogoče optimizirati. Če imaš strank malo, ali pa če poizvedbe ne poganjaš prav pogosto, načeloma ne bo pretirane panike.
Hvala Vini, ampak tole pade, če je datum začetka več kot en interval časa nazaj.
Npr. imamo 3 mesečni interval, gostovanje je bilo pa začeto pred 2 letoma.
Rešitev je v tem, da datumu pričetka gostovanja prištejemo razliko v intervalih, tako da datum pričetka ni manjši od enega intervala manj kot NOW()
:) matr je tole dobr razloženo :)
DATEADD(datumzacetka, INTERVAL (interval
*(SELECT CEILING(perioddiff(dateformat(now(), '%Y%m'), dateformat(datumzacetka, '%Y%m'))/interval
))) MONTH)
Query traja 0.18s na 500 strankah in poganjal se bo 1x dnevno, tako da ni panike.
Se pa strinjam, da bi se dalo bolj optimalno imeti zapisane podatke.