1

私が間違っていることを理解することはできません:

開始時刻と終了時刻の列があるテーブルがあり、今月の部分のみの時間の合計を分単位で計算しようとしています。

例えば。開始日:27-02-13終了日:03-03-13

すべての分=3月のみの5760分:4320

これは私のクエリですが、正しく機能していません。過去2か月の過去の時間エントリを振り返るために、where句を追加しようとしました。私は何が間違っているのですか?

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);
4

2 に答える 2

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

期間が 1 か月を超えても正しく機能することに注意してください。

于 2013-03-01T12:51:21.473 に答える
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
于 2013-03-01T12:12:16.103 に答える