[ brankec @ 12.09.2008. 06:40 ] @
Imam sledeci problem: U firmi u kojoj radim postoji Sistem za evidenciju radnog vremena (registruju se dolasci i odlasci radnika). Jedan od mojih zadataka je da u odredjeno vreme (recimo u 9 sati) javim koliko je radnika doslo na posao za taj dan (od 00:00 sati do gore navedenih 9 sati). Ja to radim sa sledecim uslovom (DT je kolona sa registrovanim vremenima):

WHERE DT BETWEEN '09/12/2008' AND GETDATE()

Zanima me (za ovaj primer ali i inace) sta da uradim da ne moram rucno ispravljati svaki novi dan prvo vreme ( '09/12/2008' u ovom slucaju). Odnosno kako da dobijem trenutni datum ali da vreme bude '00:00' (nesto kao getdate()- 'trenutno vreme'='danasnji datum' i '00:00' - vreme).

Nadam se da nisam previse iskomplikovao. Unapred hvala.
[ Branko_S @ 12.09.2008. 08:34 ] @
Recimo ovako:
WHERE DT BETWEEN Cast((Left(GetDate(), 11) + ' 00:00:000') AS DateTime) AND GETDATE()
mada slobodno mozes i ovako:
WHERE DT > Cast((Left(GetDate(), 11) + ' 00:00:000') AS DateTime)
[ mmix @ 12.09.2008. 13:43 ] @
Ako startujes istog dana u isto vreme onda mozes slobodno i da uzmes brze numericko resenje koje ne zavisi od parsiranja stringova:

WHERE DATEDIFF(day, DT, GETDATE()) = 0

a ako imas index na DT mozes i da ubrzas stvar sa

WHERE DT > CAST(DATEDIFF(day, 0, GETDATE()) as DATETIME)

oba resenja su cisto numericka, s tim sto je drugo resenje konstanta za query scope i omogucava brz scan tabele jer ce query optimizer to da provali.
[ Zidar @ 15.09.2008. 14:10 ] @
@Brankec:
mmix ti je dao dobar odgovor. I resenje koje je dao Branko_S verovatno bi radilo, ali nisam siguran da bi radilo za svaki regional setting.

Moguce je da nije bas najjasnije na prvi pogled sta se desava. Pogledaj ovo parce koda i bice ti jasnije kako se iz nekog datuma 'odesca' vremenska komponenta. Ima vise nacina da se odsece vrema ili podesi tacno vreme, pokazan je jedan od njih i nacin koji je dao mmix.

Code:

-- GetDate, datum  bez vremena, 9 sati na danasnji dan
SELECT 
[TrenutnioVreme]= Getdate() 
-- mmix nacin, veoma elegantan:
, [DanasnjiDatum_mmix] = CAST(DATEDIFF(day, 0, GETDATE()) as DATETIME)
, [DanasnjiDatum_9AM_mmix] = dateadd( hh, 9, CAST(DATEDIFF(day, 0, GETDATE()) as DATETIME))
-- jos jedan moguci nacin, manje elegantan, cisto da se setimo i fuknicje CONVERT:
, [DanasnjiDatumBezVremena] = CAST(CONVERT(varchar,Getdate() , 112) AS Datetime)
, [DanasnjiDatum_9AM] = dateadd( hh, 9, CAST(CONVERT(varchar,Getdate() , 112) AS Datetime))


Ako je ovo jasno, onda bi tvoj kod trebalo da izgleda nekako ovako, koristeci izraze koje je dao mmix (jer su kraci nego moji):

Code:

SELECT Radnik, DT FROM TvojaTabela
WHERE 
-- za danasnji dan:
CAST(DATEDIFF(day, 0, DT) as DATETIME) = CAST(DATEDIFF(day, 0, GETDATE()) as DATETIME)
-- ko se otkucao do 9 AM zakljucno:
AND DT<= dateadd( hh, 9, CAST(DATEDIFF(day, 0, GETDATE()) as DATETIME))