1

无法弄清楚我做错了什么:

我有一个表,其中包含开始时间和结束时间列,我试图仅计算本月部分的时间总和(以分钟为单位)。

例如。开始日期:27-02-13 结束日期:03-03-13

总分钟数= 5760 仅三月的分钟数: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);
4

2 回答 2

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 回答
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

请注意即使期限超过一个月,它也可以正常工作。

于 2013-03-01T12:51:21.473 回答