仅为此月份部分选择以分钟为单位的时差

时间:2013-03-01 11:52:12

标签: sql sql-server-2008-r2

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

我有一个包含开始时间和结束时间列的表格,我试图找出这个月份的时间总和(以分钟为单位)。

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

2 个答案:

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

注意即使期限超过一个月它也能正常工作。