我正在查找特定月份的开始日期和结束日期之间的分钟总和的SQL查询。
EG。 我正在寻找2月份使用的分钟数。
开始日期时间:27-02-13 00:00:00 结束日期时间:05-03-13 00:00:00
因为即时通讯仅查找2月份的总和,所以只能给我3天(以分钟为单位)的总和而不是3月份的额外5天。
答案 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))
答案 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
。我拿两个日期中较小的一个。然后,我使用StartDate
和TempDate
之间较小的原始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))