2

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

例如。我正在查找 2 月份使用的分钟数。

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

因为我只在寻找 2 月的总和,所以它应该只给我 3 天(以分钟为单位)的总和,而不是进入 3 月的额外 5 天。

4

4 回答 4

1

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

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

GL!

于 2013-02-27T13:57:49.487 回答
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 小提琴演示

于 2013-02-27T13:46:31.853 回答
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。我取两个日期中较小的一个。然后我使用原始和StartDate两者之间较小的那个来确定我的总分钟数。TempDateEndDate

另请参阅 EOMONTH:http: //msdn.microsoft.com/en-us/library/hh213020.aspx

于 2013-02-27T13:57:21.250 回答
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))
于 2013-02-27T14:12:28.220 回答