SQL Serverで1か月の日数を確認する方法は?


95

SQL Serverで特定の日付の月の日数を確認する必要があります。

組み込み関数はありますか?そうでない場合、ユーザー定義関数として何を使用すればよいですか?

回答:


115

指定した月の最初の日には、次のものを使用できます。

datediff(day, @date, dateadd(month, 1, @date))

すべての日付で機能させるには:

datediff(day, dateadd(day, 1-day(@date), @date),
              dateadd(month, 1, dateadd(day, 1-day(@date), @date)))

2
スタンが言うように、これはいくつかのケースで不正確な結果をもたらすでしょう
DJ。

3
もしかして:datediff(day、dateadd(day、1-day(@date)、@date)、dateadd(month、1、dateadd(day、1-day(@date)、@date)))
feihtthief 2009年

3
まれなコーナーケースですが、偶然に遭遇しました。これは、9999
。– Heinzi

1
これは、9999年12月のどの日付でも機能しません。日付タイプでオーバーフローが発生します。これはSQL Server 2014で私のために機能しました: case when datediff(m, dateadd(day, 1-day(@date), @date), convert(date, convert(datetime, 2958463))) > 0 then datediff(day, dateadd(day, 1-day(@date), @date), dateadd(month, 1, dateadd(day, 1-day(@date), @date))) else 31 end
bradwilder31415

2
ここで説明するすべての解決策は、@ Mikael Erikssonのエレガントな回答に比べると見劣りします。これは、ニッチなケースのクレイジーな回避策なしで有効な日付が提供され、はるかに単純なコードである場合は常に機能します。T-SQLスティックを使用している場合dayは、eomonth出力のコンポーネントを取得することを強くお勧めします。
bsplosion

148

SQL Server 2012では、EOMONTH(Transact-SQL)を使用して月の最終日を取得し、DAY(Transact-SQL)を使用して月の日数を取得できます

DECLARE @ADate DATETIME

SET @ADate = GETDATE()

SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth

1
また、特定の日数が必要な場合は、DATEFROMPARTSメソッドを使用することもできます。上記のコードはSELECT DAY(EOMONTH(DATEFROMPARTS(@year、@month、1)))AS DaysInMonth
nmariot

@ADateが複雑な計算値である場合、このソリューションの美しさが発揮されます。+1
ステファンシュタイガー2018

本当にありがとうございます!
Rejwanul Reja

27

最もエレガントなソリューション:@DATEで機能します

DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,@DATE),0)))

関数内でスローするか、インラインで使用します。これにより、他の回答に余分な迷惑メールが一切含まれずに元の質問に回答します。

他の回答の日付の例:

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'1/31/2009'),0))) 31を返します

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'2404-feb-15'),0))) 29を返します

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'2011-12-22'),0))) 31を返します


22

はるかに簡単...試してください day(eomonth(@Date))


1
あなたの答えは最高なので、簡単です。ありがとう!
2014

12
--Last Day of Previous Month
SELECT DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)))

--Last Day of Current Month
SELECT DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)))

--Last Day of Next Month
SELECT DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0)))

個人的には、組み込み関数がない場合は、UDFを作成します...



3

次のコードは、当月の日数を取得します。

SELECT datediff(dd,getdate(),dateadd(mm,1,getdate())) as datas

getdate()日を数える必要がある日付に変更します。


2
   --- sql server below 2012---
    select day( dateadd(day,-1,dateadd(month, 1, convert(date,'2019-03-01'))))
    -- this for sql server 2012--
    select day(EOMONTH(getdate()))

1

解決策1:現在の月の日数を見つける

DECLARE @dt datetime
SET     @dt = getdate()

SELECT @dt AS [DateTime],
       DAY(DATEADD(mm, DATEDIFF(mm, -1, @dt), -1)) AS [Days in Month]

解決策2:特定の月と年の組み合わせの日数を見つける

DECLARE @y int, @m int
SET     @y = 2012
SET     @m = 2

SELECT @y AS [Year],
       @m AS [Month],
       DATEDIFF(DAY,
                DATEADD(DAY, 0, DATEADD(m, ((@y - 1900) * 12) + @m - 1, 0)),
                DATEADD(DAY, 0, DATEADD(m, ((@y - 1900) * 12) + @m, 0))
               ) AS [Days in Month]

1

関数を追加する必要はありますが、それは簡単なものです。私はこれを使います:

CREATE FUNCTION [dbo].[ufn_GetDaysInMonth] ( @pDate    DATETIME )

RETURNS INT
AS
BEGIN

    SET @pDate = CONVERT(VARCHAR(10), @pDate, 101)
    SET @pDate = @pDate - DAY(@pDate) + 1

    RETURN DATEDIFF(DD, @pDate, DATEADD(MM, 1, @pDate))
END

GO

1
ところで、DATEDIFFとDATEADDの組み合わせは、常に機能するとは限りません。あなたはそれに2009年1月31日の日付を入れる場合は、DATEADDは、2009年2月28日を返し、DATEDIFFはむしろ31よりも、あなたに28を与える

チェックする方法、つまり、月の日をチェックするために実行することを意味しますか?
2015

1
SELECT Datediff(day,
(Convert(DateTime,Convert(varchar(2),Month(getdate()))+'/01/'+Convert(varchar(4),Year(getdate())))),
(Convert(DateTime,Convert(varchar(2),Month(getdate())+1)+'/01/'+Convert(varchar(4),Year(getdate()))))) as [No.of Days in a Month]

1
select  datediff(day, 
        dateadd(day, 0, dateadd(month, ((2013 - 1900) * 12) + 3 - 1, 0)),
        dateadd(day, 0, dateadd(month, ((2013  - 1900) * 12) + 3, 0))
        )

ニースシンプルで、関数を作成する必要はありません。


1

関数を作成する必要がありますが、それはあなた自身の便宜のためです。これは完璧に動作し、この関数を使用して計算に失敗することはありませんでした。

CREATE FUNCTION [dbo].[get_days](@date datetime)
RETURNS int
AS
BEGIN
    SET @date = DATEADD(MONTH, 1, @date)
    DECLARE @result int = (select DAY(DATEADD(DAY, -DAY(@date), @date)))
    RETURN @result
END

仕組み:日付自体から日付の日数を引くと、前月の最終日がわかります。したがって、指定された日付に1か月を加算し、日数を減算して、結果の日コンポーネントを取得する必要があります。



0

Mehrdadに賛成票を投じたが、これも機能する。:)

CREATE function dbo.IsLeapYear
(
    @TestYear int
)
RETURNS bit
AS
BEGIN
    declare @Result bit
    set @Result = 
    cast(
        case when ((@TestYear % 4 = 0) and (@testYear % 100 != 0)) or (@TestYear % 400 = 0)
        then 1
        else 0
        end
    as bit )
    return @Result
END
GO

CREATE FUNCTION dbo.GetDaysInMonth
(
    @TestDT datetime
)
RETURNS INT
AS
BEGIN

    DECLARE @Result int 
    DECLARE @MonthNo int

    Set @MonthNo = datepart(m,@TestDT)

    Set @Result = 
    case @MonthNo
        when  1 then 31
        when  2 then 
            case 
                when dbo.IsLeapYear(datepart(yyyy,@TestDT)) = 0
                then 28
                else 29
            end
        when  3 then 31
        when  4 then 30
        when  5 then 31
        when  6 then 30
        when  7 then 31
        when  8 then 31
        when  9 then 30 
        when 10 then 31
        when 11 then 30 
        when 12 then 31
    end

    RETURN @Result
END
GO

テストする

declare @testDT datetime;

set @testDT = '2404-feb-15';

select dbo.GetDaysInMonth(@testDT)


0

私はこの質問が古いことを知っていますが、私が使用しているものを共有したいと思いました。

DECLARE @date date = '2011-12-22'

/* FindFirstDayOfMonth - Find the first date of any month */
-- Replace the day part with -01
DECLARE @firstDayOfMonth date = CAST( CAST(YEAR(@date) AS varchar(4)) + '-' + 
                                      CAST(MONTH(@date) AS varchar(2)) + '-01' AS date)
SELECT @firstDayOfMonth

そして

DECLARE @date date = '2011-12-22'

/* FindLastDayOfMonth - Find what is the last day of a month - Leap year is handled by DATEADD */
-- Get the first day of next month and remove a day from it using DATEADD
DECLARE @lastDayOfMonth date = CAST( DATEADD(dd, -1, DATEADD(mm, 1, FindFirstDayOfMonth(@date))) AS date)

SELECT @lastDayOfMonth

これらを組み合わせて、必要に応じて1か月の日数を取得する単一の関数を作成できます。


0
SELECT DAY(SUBDATE(ADDDATE(CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-1'), INTERVAL 1 MONTH), INTERVAL 1 DAY))

素敵な「n」シンプルで、関数を作成する必要はありません


これはSQL Server用です。subdate機能について聞いたことがありません。
LittleBobbyTables-Au Revoir 2012年

0

Mehrdad Afshariの返信は最も正確です。通常の回答とは異なり、この回答はCurtis McEnroeのブログhttps://cmcenroe.me/2014/12/05/days-in-month-formula.htmlで与えられた正式な数学的アプローチに基づいています。

DECLARE @date  DATE= '2015-02-01'
DECLARE @monthNumber TINYINT 
DECLARE @dayCount TINYINT
SET @monthNumber = DATEPART(MONTH,@date )
SET @dayCount = 28 + (@monthNumber + floor(@monthNumber/8)) % 2 + 2 %    @monthNumber + 2 * floor(1/@monthNumber)   
SELECT @dayCount + CASE WHEN @dayCount = 28 AND DATEPART(YEAR,@date)%4 =0 THEN 1 ELSE 0 END -- leap year adjustment

0

いいえを得るために。1か月の日のうち、SQLで使用可能なDay()を直接使用できます。

SQL Server 2005/2008に対する私の回答の最後に投稿されたリンクをたどってください。

次の例と結果はSQL 2012からのものです

alter function dbo.[daysinm]
(
@dates nvarchar(12)
)
returns int
as
begin
Declare @dates2 nvarchar(12)
Declare @days int
begin
select @dates2 = (select DAY(EOMONTH(convert(datetime,@dates,103))))
set @days = convert(int,@dates2)
end
return @days
end

--select dbo.daysinm('08/12/2016')

SQL Server SSMSの結果

  (no column name)
1 31

処理する:

EOMONTHを使用する場合、使用する日付形式はSQLサーバーのDateTime形式に変換されます。次に、EOMONTH()の日付出力は2016-12-31になり、2016は年、12は月、31は日になります。この出力をDay()に渡すと、その月の合計日数がわかります。

チェックの結果をすぐに取得したい場合は、以下のコードを直接実行できます。

select DAY(EOMONTH(convert(datetime,'08/12/2016',103)))

または

select DAY(EOMONTH(convert(datetime,getdate(),103)))

SQL Server 2005/2008/2012での作業の参照については、次の外部リンクをたどってください...

SQLで月の日数を見つける


0
DECLARE @date DATETIME = GETDATE(); --or '12/1/2018' (month/day/year) 
SELECT DAY(EOMONTH ( @date )) AS 'This Month'; 
SELECT DAY(EOMONTH ( @date, 1 )) AS 'Next Month';

結果:今月31

来月30


これはその月の日数を返しません
アシュリーダウ2018

はい、そうです。ただし、SQL Server 2012以降のみ
AlbertoCláudioMandlate

0
DECLARE  @m int
SET     @m = 2

SELECT 
       @m AS [Month],
       DATEDIFF(DAY,
                DATEADD(DAY, 0, DATEADD(m, +@m -1, 0)),
                DATEADD(DAY, 0, DATEADD(m,+ @m, 0))
               ) AS [Days in Month]



-1
DECLARE @date nvarchar(20)
SET @date ='2012-02-09 00:00:00'
SELECT DATEDIFF(day,cast(replace(cast(YEAR(@date) as char)+'-'+cast(MONTH(@date) as char)+'-01',' ','')+' 00:00:00' as datetime),dateadd(month,1,cast(replace(cast(YEAR(@date) as char)+'-'+cast(MONTH(@date) as char)+'-01',' ','')+' 00:00:00' as datetime)))

-1

SQLServer2012の簡単なクエリ:

日を選択(('20 -05-1951 22:00:00 '))

私は多くの日付をテストしましたが、常に正しい結果を返します


2
SELECT DAY(CAST( '1951-05-20' AS DATE))は、日付の日の部分である20を返します。5月の日数は返しません。
Mienでも

-1

select first_day = dateadd(dd、-1 * datepart(dd、getdate())+ 1、getdate())、last_day = dateadd(dd、-1 * datepart(dd、dateadd(mm、1、getdate())) 、dateadd(mm、1、getdate()))、no_of_days = 1 + datediff(dd、dateadd(dd、-1 * datepart(dd、getdate())+ 1、getdate())、dateadd(dd、-1 * datepart(dd、dateadd(mm、1、getdate()))、dateadd(mm、1、getdate())))

特定の日付の月数を取得するには、日付をgetdateに置き換えます


-1
DECLARE @Month INT=2,
    @Year INT=1989
DECLARE @date DateTime=null
SET @date=CAST(CAST(@Year AS nvarchar) + '-' + CAST(@Month AS nvarchar) + '-' + '1' AS DATETIME);

DECLARE @noofDays TINYINT 
DECLARE @CountForDate TINYINT
SET @noofDays = DATEPART(MONTH,@date )
SET @CountForDate = 28 + (@noofDays + floor(@noofDays/8)) % 2 + 2 %    @noofDays + 2 * floor(1/@noofDays)   
SET @noofDays= @CountForDate + CASE WHEN @CountForDate = 28 AND DATEPART(YEAR,@date)%4 =0 THEN 1 ELSE 0 END
PRINT @noofDays

1
こんにちは、SOへようこそ!コードはそれ自体で説明できるかもしれませんが、詳細を提供すると、回答の質を向上させるのに役立ちます!
mrun 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.