2013-10-16 176 views
0

我很困惑,如果這是正確的,如果我想要計算從例如我的房屋登錄人數。 2013年10月16日下午10點至10月17日凌晨2點。SQL計數數據從晚上10點到凌晨2點(第二天)

它看起來很好,我只是問,這是做到這一點的正確方法,否則我會忽略一些超過上午12點的數據?

SELECT COUNT (SignInLog.PlayerID) as '10pm-230am' 
FROM SignInLog inner join Members 
ON 
Members.ID = SignInLog.PlayerID and 
SignIn >= '2013-09-01' and 
SignOut <= '2013-10-01' and 
DATEPART(hh, SignIn) >= 22 and 
DATEPART(hh, SignOut) <= 3 
and KioskID=1 
and Members.MemberCategory Between 1 and 13 

在此先感謝

+0

它是正確的,我認爲 – donstack

+0

您可以留下參加剛剛'Members.ID = SignInLog.PlayerID'和其他一切採取'WHERE'條款,如果你要使用一些不同的聯接(左或右)這個不要」 T會是非常正確的... – Justin

+0

你的代碼不符合問題。您請求登錄人員,但您的查詢會列出在此期間登錄和登出的人員。不包括之前登錄或退出後登錄的人員。 – adrianm

回答

0

看來你的日期是搞砸了,你已經交換月份和日期。 這是不正確的方法,你的表現會因爲日期部分計算的可怕,試試這個來代替:

SELECT COUNT (SignInLog.PlayerID) as '10pm-230am' 
FROM SignInLog inner join Members 
ON 
Members.ID = SignInLog.PlayerID and 
SignOut >= '2013-10-16T22:00:00' and 
SignIn <= '2013-10-17T02:00:00' and -- changed it according to question 
KioskID=1 and 
Members.MemberCategory Between 1 and 13 

注:閱讀@Adrianms評論後,我改變了我的答案。現在,如果人們有任何重疊,查詢就會找到它。想象一下,在2013-10-16 15:00和/或在2013-10-17 04:00退房和/或在2013-10-17 04:00退房

+0

你忘了'T'和秒是不可選的。即'2013-09-01T22:00:00' – adrianm

+0

@adrianm thx,我想知道當我測試時出了什麼問題 –

+0

我在那個晚上10點到第二天每天凌晨2點登錄。那爲什麼它從2013年1月9日運行到1/10/13 – user2378645

0

除了之前的回答,我從中收集到的使用CAST應該在這裏工作:

SELECT COUNT (SignInLog.PlayerID) as '10pm-230am' 
FROM SignInLog inner join Members 
ON 
Members.ID = SignInLog.PlayerID and 
SignIn >= CAST('2013-09-01 22:00:00' AS DATETIMEOFFSET) and 
SignOut <= CAST('2013-10-01 03:00:00' AS DATETIMEOFFSET) and 
and KioskID=1 
and Members.MemberCategory Between 1 and 13 
相關問題