无法弄清楚我做错了什么:
我有一个包含开始时间和结束时间列的表格,我试图找出这个月份的时间总和(以分钟为单位)。
EG。 开课日期:27-02-13 截止日期:03-03-13
所有分钟= 5760 仅限3月份的会议纪要:4320
这是我的查询,但它无法正常工作,我试图添加一个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);
答案 0 :(得分: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
答案 1 :(得分: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
注意即使期限超过一个月它也能正常工作。