我正在查找某個月的開始日期和結束日期之間的分鐘總和的SQL查詢。SQL - 兩個時間戳之間的分鐘總和
例如, 我正在尋找2月份使用的分鐘數。
開始日期時間:27-02-13 00:00:00 結束日期和時間:13年5月3日00:00:00
因爲我只是想找月份的總和,應該只給我總共3天(分鐘),而不是額外的5天進入遊行。
我正在查找某個月的開始日期和結束日期之間的分鐘總和的SQL查詢。SQL - 兩個時間戳之間的分鐘總和
例如, 我正在尋找2月份使用的分鐘數。
開始日期時間:27-02-13 00:00:00 結束日期和時間:13年5月3日00:00:00
因爲我只是想找月份的總和,應該只給我總共3天(分鐘),而不是額外的5天進入遊行。
我沒有辦法驗證它,但它應該是這樣的:
SELECT DATEDIFF(minute, startDate, CASE when endDate > EOMONTH(startDate) THEN EOMONTH(startDate) ELSE endDate END) FROM ...
GL!
+1爲簡單起見。 – 2013-02-27 13:59:36
謝謝Eli,我沒有EOMONTH函數來替換它,如下所示:SELECT DATEDIFF(minute,datetime5,CASE when datetime6> dateadd(mm,datediff(mm,0,GetDate())+ 1,0)THEN dateadd( mm,datediff(mm,0,GetDate())+ 1,0)ELSE datetime6 END)AS TotalMinutes,0 FROM AllUserData – Aaron 2013-02-27 17:36:51
我現在唯一的挑戰是,如果有人爲lastmonth創建了一個包含本月分鐘的條目,我該如何包括他們在我的總和。 :) – Aaron 2013-02-27 17:39:01
考慮使用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))
I l以逐步說明每個過程。當然,你可以輕易地將其解決,但我會讓你去做。
這裏是我的解決方案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
完美的感謝工廠 – Aaron 2013-02-27 14:14:49
@Aaron一旦你瞭解我的答案顯示的基礎知識,我會考慮用http://stackoverflow.com/a/15113905/1795053作爲你的解決方案。它是使用內置SQL函數獲取EOMONTH日期的大大簡化/壓縮版本。 – 2013-02-27 14:22:24
我最近不得不解決類似的問題,我添加了兩個新的功能,以幫助這一點:
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))
哪個RDBMS - 日期/時間函數是數據庫特定的。 – sgeddes 2013-02-27 13:42:26
我正在使用SQL驅動程序的SQL Server 2008 R2盒子的odbc連接。 – Aaron 2013-02-27 13:45:01
我已經嘗試過使用計算列和總結數據,但是當數據流入下個月時,我的總和是錯誤的。 – Aaron 2013-02-27 13:45:42