[ dilber @ 05.12.2008. 02:57 ] @
Vidim da na forumu ima slićnih pitanja. Imam jednu tabelu sa dva polja (startdatum i enddatum), što znaći treba mi razlika dana između ova dva datuma. Međutim, Moj problem je ova kombinacija "case when i DateDiff". Code koji sam postavio u izvještaju daje mi nule, oćito trebala bi mi neka kombinacija sa "convert" ili tako nekako. Ukoliko neko može da pomogne bio bih mu zahvalan.

Ovaj dio code je izdvojen iz konteksta (samo da ne zbunjuje)

& " CASE WHEN tabela1.startdate <> Null THEN DateDiff(d,tabela1.startdate,tabela1.enddate) ELSE 0 END AS razlikadana," _
[ Shinhan @ 05.12.2008. 08:12 ] @
"<> NULL" je greška
Za null proveru radi: IS NULL ili IS NOT NULL

I da li ti se polje zove startdate ili startdatum?

Otkud tri parametra u DateDiff funkciji?

Takođe, zašto uopšte proveravaš da li je startdate NULL?
Uradi samo "DateDiff(tabela1.startdate,tabela1.enddate) AS razlikadana" i onda u aplikaciji detektuj da li je razlikadana NULL.
[ bogdan.kecman @ 05.12.2008. 12:25 ] @
Code:

DATEDIFF(expr1,expr2)

DATEDIFF() returns expr1 – expr2 expressed as a value in days from one date to the other. expr1 and expr2 are date or date-and-time expressions. Only the date parts of the values are used in the calculation.

mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30');
        -> 1
mysql> SELECT DATEDIFF('2010-11-30 23:59:59','2010-12-31');
        -> -31


Potpuno ti je nepotreban deo sa <> NULL (vec ti je receno da za to moras da koristis IS [NOT] NULL )
pogledaj: http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html vezano za kako se radi sa NULL vrednosti


.. tako da bi tvoj upit izgledao:

Code:

DATEDIFF(tabela1.enddate,tabela1.startdate) AS razlikadana


primer
Code:

mysql> SELECT DATEDIFF('2010-11-20', '2010-11-10')\G
*************************** 1. row ***************************
DATEDIFF('2010-11-20', '2010-11-10'): 10
1 row in set (0.00 sec)

mysql> SELECT DATEDIFF('2010-11-20', NULL)\G
*************************** 1. row ***************************
DATEDIFF('2010-11-20', NULL): NULL
1 row in set (0.00 sec)

mysql> SELECT DATEDIFF(NULL, '2010-11-10')\G
*************************** 1. row ***************************
DATEDIFF(NULL, '2010-11-10'): NULL
1 row in set (0.00 sec)

mysql> SELECT DATEDIFF(NULL, NULL)\G
*************************** 1. row ***************************
DATEDIFF(NULL, NULL): NULL
1 row in set (0.00 sec)



dakle ako je bilo koji parametar DATEDIFF funkcije NULL, vratice NULL. onda u aplikaciji taj NULL prikazi kako treba posto razlika od 0 dana nije ista kao "pogresno unet podatak" i ako tretiras u aplikaciji te dve stvari identicno - negde gadno gresis.

Ako bas oces da ti to bude "isto" onda mozes:

Code:

mysql> create table t1 (startdate date, enddate date);
mysql> insert into t1 values ('2010-11-10', '2010-11-20');
mysql> insert into t1 values ('2010-11-10', NULL);
mysql> SELECT IF(t1.enddate IS NOT NULL AND t1.startdate IS NOT NULL, DATEDIFF(t1.enddate, t1.startdate), 0) razlika FROM t1;
+---------+
| razlika |
+---------+
|      10 | 
|       0 | 
+---------+


[ dilber @ 05.12.2008. 13:06 ] @
Samo da na moj postavljen upit "dodam pojašnjenje"
Pogledajte, molim vas, pokušavao sam i ovo što ste mi predlagali i ne ide ili... U bazi upisuje podatke kao datetime i to je OK, sada bi trebao u izvještaju dobiti "razliku dana", pokušavao sam nekoliko različitih varijanti i ...., s toga šaljem kompletan SQL upit , inaće dok sam koristio Access bazu ovo je radilo OK, naravno samo je umjesto CASE WHEN stajala funkcija IIF, dok sada ovo pokušavam da proradi na SQL bazi.

Ovo su polja iz kojih trebam dobiti "razliku dana"
procedura.dpz (dpz - početni datum) i
procedura.dok (krajnji datum)

strsql7 = "SELECT procedura.*, registar_1.nazreg as nazodj, registar_2.nazreg as nazkan, kandidat.kosdd, " _
& " CASE WHEN procedura.sifpozicija <> '' THEN 1 ELSE 0 END AS brpoz, " _
& " CASE WHEN procedura.dpz THEN DateDiff(d,procedura.dpz,procedura.dok) ELSE 0 END AS doobjave " _
& " FROM ((procedura " _
& " LEFT JOIN registar AS registar_1 ON 'ODJELEN'+procedura.odjeljenje = registar_1.sifreg) " _
& " LEFT JOIN registar AS registar_2 ON 'GRAD'+procedura.grad = registar_2.sifreg) " _
& " WHERE (procedura.dzk <= CONVERT (smalldatetime,'" & Format(cDatDo, "dd-mm-yyyy") & "',104)" _
& " and procedura.dzk > CONVERT (smalldatetime,'" & Format(cDatOd, "dd-mm-yyyy") & "',104)) " _
& " and procedura.odjeljenje <> '" & txtSOdjel & "' AND procedura.kanton <> '" & txtSKan & "'" _
& " ORDER BY procedura.odjeljenje,procedura.grad,procedura.organ"

Hvala
[ bogdan.kecman @ 05.12.2008. 13:19 ] @
denise,

ajde ti lepo postavi ovde tacnu strukturu podataka (izlaz komande SHOW CREATE TABLE imetabele\G za sve tabele koje koristis u upitu) pa da proverimo sta ne valja.. mnogo lakse nego ovako napamet ...

[ dilber @ 06.12.2008. 00:38 ] @
Prije svega želim se zahvaliti svima na forumu, prije svega Shinhan-u i Bogdanu. Problem je bio zbog neispravnog definisanja Null polja. Kako baza koju koristim u nekom vremenskom periodu jedno datumskom polje neće biti Null, dok će drugo datumskom polje biti Null morao sam u obzir uzeti samo one slogove koji nisu Null zbog izvještaja koji koristim .
Nisam mogao upotrijebiti samo Datediff(.......) bez kod-a CASE WHEN, na ovaj naćin sam uspio tek dobiti razliku između dva datuma. S tog, ukoliko neko bude imao potrebu za rješavanje problema u nekom izvještaju, a da je slučaj kao moj, ispod ovog teksta može pogledati kod koji je ispravan i funkcionalan.

CASE WHEN tabela.startdate IS NOT NULL Or tabela.enddate IS NOT NULL THEN DATEDIFF(d, tabela.startdate, tabela.enddate)ELSE '' END AS brojdana


P.S. Forum je izuzetan sa kvalitetnim prijedlozima i veoma je aktivan sa diskusijom. Hvala vam.
[ bogdan.kecman @ 06.12.2008. 01:20 ] @
denise, pogledaj zadnji primer u postu od mene ...
Code:

SELECT IF(t1.enddate IS NOT NULL AND t1.startdate IS NOT NULL, DATEDIFF(t1.enddate, t1.startdate), 0) razlika FROM t1;


to ti vraca 0 ako je neko od polja NULL i razliku ako su oba polja ok... IF je nesto brzi od CASE tako da ti savetujem da trosis njega .. umesto one nule na kraju (, 0) mozes da stavis (, '') ili sta vec zelis da ti vrne za NULL vrednost ..
[ dilber @ 06.12.2008. 12:31 ] @
Jako lijepo rješenje, kod primjenjen i radi, hvala.