特定の月の開始日から終了日までの分数の合計を求める 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!
各プロセスを説明するために、手順を残しました。もちろん、これを簡単に折りたたむこともできますが、それはあなたに任せます。
これが私の解決策です 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
ます。次に、それから月初の日付を作成します。次に、それに 1 か月を追加して、翌月の最初の月を取得します。次に、その新しい日付が > または < 前の日付であるかどうかを確認しEndDate
ます。2 つの日付のうち、小さい方の日付を使用します。次に、オリジナルと と の間のいずれか小さい方を使用して、StartDate
総時間を決定します。TempDate
EndDate
関連項目 EOMONTH: http://msdn.microsoft.com/en-us/library/hh213020.aspx
最近、同様の問題を解決する必要がありました。これを支援するために、2 つの新しい関数を追加しました。
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))
使用を検討してください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))