我正在寻找特定月份的开始日期和结束日期之间的分钟总和的 SQL 查询。
例如。我正在查找 2 月份使用的分钟数。
开始日期时间:27-02-13 00:00:00 结束日期时间:05-03-13 00:00:00
因为我只在寻找 2 月的总和,所以它应该只给我 3 天(以分钟为单位)的总和,而不是进入 3 月的额外 5 天。
我正在寻找特定月份的开始日期和结束日期之间的分钟总和的 SQL 查询。
例如。我正在查找 2 月份使用的分钟数。
开始日期时间:27-02-13 00:00:00 结束日期时间:05-03-13 00:00:00
因为我只在寻找 2 月的总和,所以它应该只给我 3 天(以分钟为单位)的总和,而不是进入 3 月的额外 5 天。
我无法验证它,但它应该看起来像:
SELECT DATEDIFF(minute, startDate, CASE when endDate > EOMONTH(startDate) THEN EOMONTH(startDate) ELSE endDate END) FROM ...
GL!
考虑使用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))
我把它分步骤来说明每个过程。您当然可以轻松地将其折叠起来,但我将由您来完成。
这是我的解决方案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
两者之间较小的那个来确定我的总分钟数。TempDate
EndDate
另请参阅 EOMONTH:http: //msdn.microsoft.com/en-us/library/hh213020.aspx
我最近不得不解决一个类似的问题,我添加了两个新功能来帮助解决这个问题:
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))