2013-02-27 112 views
2

我正在查找某個月的開始日期和結束日期之間的分鐘總和的SQL查詢。SQL - 兩個時間戳之間的分鐘總和

例如, 我正在尋找2月份使用的分鐘數。

開始日期時間:27-02-13 00:00:00 結束日期和時間:13年5月3日00:00:00

因爲我只是想找月份的總和,應該只給我總共3天(分鐘),而不是額外的5天進入遊行。

+0

哪個RDBMS - 日期/時間函數是數據庫特定的。 – sgeddes 2013-02-27 13:42:26

+0

我正在使用SQL驅動程序的SQL Server 2008 R2盒子的odbc連接。 – Aaron 2013-02-27 13:45:01

+0

我已經嘗試過使用計算列和總結數據,但是當數據流入下個月時,我的總和是錯誤的。 – Aaron 2013-02-27 13:45:42

回答

1

我沒有辦法驗證它,但它應該是這樣的:

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

GL!

+0

+1爲簡單起見。 – 2013-02-27 13:59:36

+0

謝謝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

+0

我現在唯一的挑戰是,如果有人爲lastmonth創建了一個包含本月分鐘的條目,我該如何包括他們在我的總和。 :) – Aaron 2013-02-27 17:39:01

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

+0

我已經有DATEDIFF部分工作正常,我可以得到兩列之間的差異。我正在努力的部分是如何按月分解它。 – Aaron 2013-02-27 13:53:28

+0

@Aaron - 你想通過它一個月,只是返回2月?或者你正在考慮將開始/結束時間的月份分組? – sgeddes 2013-02-27 13:54:29

+0

是的即時通訊一個月,並且只是返回2月 – Aaron 2013-02-27 13:57:29

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。我拿兩個日期中較小的一個。然後我使用原始的StartDateTempDateEndDate之間的較小者來確定我的總分鐘數。

另請參見EOMONTH:http://msdn.microsoft.com/en-us/library/hh213020.aspx

+0

完美的感謝工廠 – Aaron 2013-02-27 14:14:49

+0

@Aaron一旦你瞭解我的答案顯示的基礎知識,我會考慮用http://stackoverflow.com/a/15113905/1795053作爲你的解決方案。它是使用內置SQL函數獲取EOMONTH日期的大大簡化/壓縮版本。 – 2013-02-27 14:22:24

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)) 
相關問題