2013-03-01 84 views
1

無法弄清楚什麼即時做錯了:選擇時間差只有

我有了一個開始時間和結束時間列和IM試圖找出的時間(分鐘)的總和表僅限本月份。

例如, 開始日期:27-02-13 結束日期:13年3月3日

在所有分鐘= 5760 分鐘,只有3月份:4320

這是我的查詢,但它不能正常工作,我嘗試要添加一個where子句來回顧最近兩個月的前期時間entrys。我究竟做錯了什麼?

SELECT 
isnull((Sum(DATEDIFF(minute, 
CASE when datetime5 < dateadd(mm,datediff(mm,0,GetDate()), 0) 
THEN dateadd(mm,datediff(mm,0,GetDate()), 0) 
ELSE datetime5 END, 
CASE when datetime6 > dateadd(mm,datediff(mm,0,GetDate())+1, 0) 
THEN dateadd(mm,datediff(mm,0,GetDate())+1, 0) 
ELSE datetime6 END))/60.0),0) 
as Minutes , 0 
FROM AllUserData 
WHERE tp_ListID in (select tp_ID from Lists where tp_Title = 'D1 Downtime') 
and datetime5 >=dateadd(mm,datediff(mm,0,GetDate())-2, 0); 
+0

SQL server 2008 R2 – Aaron 2013-03-01 11:52:49

回答

0

看到這個SQL Fiddle

with month_start_finish (month_start, month_finish) as 
(
    -- here you get the beginning of the current month and the next month 
    -- needed for filters and calculations 
    select 
    dateadd(month, datediff(month, 0, getdate()), 0), 
    dateadd(month, datediff(month, 0, getdate()) + 1, 0) 
) 
select start_date, finish_date, 
    -- here you calculate your minutes 
    datediff(minute, 
      case when start_date > month_start then start_date else month_start end, 
      case when finish_date < month_finish then finish_date else month_finish end 
     ) as minutes_in_this_month 
from test, month_start_finish 
where start_date < month_finish -- here you remove any periods that 
and finish_date > month_start -- are not related to the current month 

請注意,即使週期超過一個月,它如何正常工作。

+0

同意和測試,謝謝。 ;) – Aaron 2013-03-01 14:42:11

0

選擇本月初以後結束的所有記錄。

然後,可以與這樣的(僞代碼)來獲得這是在這個月的每個記錄的部分:

end - max(start,start_of_this_month) 

取期間的開始或在本月的開始,取後來。

這應該有助於您簡化查詢,我認爲。這裏是基本思想(再次僞代碼,因爲我不知道SQL Server日期操作的細微差別)。

select sum(elapsed_time) from (
     select end - max(start,start_of_this_month) as elapsed_time 
      from your table 
      where end > start_of_this_month 
    ) time_periods 
+0

謝謝丹,我總是很高興知道這是一個更簡單的解決方案,你能給我一個例子使用上面的信息? – Aaron 2013-03-01 12:20:47

相關問題