SQL - 按月分隔的两个时间戳之间的分钟总和

时间:2013-02-27 13:41:49

标签: sql sql-server-2008

我正在查找特定月份的开始日期和结束日期之间的分钟总和的SQL查询。

EG。 我正在寻找2月份使用的分钟数。

开始日期时间:27-02-13 00:00:00 结束日期时间:05-03-13 00:00:00

因为即时通讯仅查找2月份的总和,所以只能给我3天(以分钟为单位)的总和而不是3月份的额外5天。

4 个答案:

答案 0 :(得分:1)

我无法验证它,但它看起来应该是:

SELECT DATEDIFF(minute, startDate, CASE when endDate > EOMONTH(startDate) THEN EOMONTH(startDate) ELSE endDate END) FROM ...

GL!

答案 1 :(得分:0)

使用DATEDIFF - 这只会帮助您入门:

SELECT DATEDIFF(minute, starttime, endtime) 

http://msdn.microsoft.com/en-us/library/ms189794.aspx

要获取开始月份的最后一天,请使用DATEADD

SELECT DATEADD(second,-1,DATEADD(month, DATEDIFF(month,0,starttime)+1,0))

SQL Fiddle Demo

答案 2 :(得分:0)

我分步说明了每个过程。你当然可以轻易地将其解散,但我会留给你做这件事。

这是我的解决方案http://www.sqlfiddle.com/#!3/b4991/1/0

SELECT *
  , DATEDIFF(minute, StartDAte, NewEndDate) AS TotalMinutes
FROM
(
  SELECT *
    , CASE WHEN TempDate > EndDate THEN EndDate ELSE TempDate END AS NewEndDate -- Either EOM or old EndDate, whichever is smaller
  FROM
  (
    SELECT *
      , DATEADD(month, 1, CAST(Year + '-' + Month + '-1' AS DATETIME)) AS TempDate -- first day of the next month
    FROM
    (
      select *
       , CAST(DATEPART(month, StartDate) AS char(2)) AS Month
       , CAST(DATEPART(year, StartDate) AS char(4)) AS Year
      from tbl
    ) t0
  ) t1
) t2

首先,我从原始StartDate获得年份和月份。然后我构建了一个月初的日期。然后我再添加一个月来获得下个月的第一个月。然后我检查新的日期是否>或者<上一个EndDate。我拿两个日期中较小的一个。然后,我使用StartDateTempDate之间较小的原始EndDate来确定我的总分钟数。

另见EOMONTH:http://msdn.microsoft.com/en-us/library/hh213020.aspx

答案 3 :(得分:0)

我最近不得不解决类似的问题,我添加了两个新功能来帮助解决这个问题:

CREATE FUNCTION [dbo].[GREATESTDATE] 
(
    -- Add the parameters for the function here
    @Date1 DATETIME,
    @Date2 DATETIME
)
RETURNS DATETIME
AS
BEGIN


    IF (@Date1 < @Date2)
        RETURN @Date2
    ELSE 
        RETURN @Date1

END

和...

CREATE FUNCTION [dbo].[LEASTDATE] 
(
    -- Add the parameters for the function here
    @Date1 DATETIME,
    @Date2 DATETIME
)
RETURNS DATETIME
AS
BEGIN

    IF (@Date1 > @Date2)
        RETURN @Date2
    ELSE 
        RETURN @Date1

END

然后使用它们:

DATEDIFF(D,dbo.GREATESTDATE(@StartDate1,@StartDate2),dbo.LEASTDATE(@EndDate1,@EndDate2))