web-dev-qa-db-ja.com

SQL Serverで月の日数を決定する方法は?

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

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

85
Even Mien

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

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

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

datediff(day, dateadd(day, 1-day(@date), @date),
              dateadd(month, 1, dateadd(day, 1-day(@date), @date)))
110
Mehrdad Afshari

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

DECLARE @ADate DATETIME

SET @ADate = GETDATE()

SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth
135
Mikael Eriksson

最もエレガントなソリューション:すべての@ 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
Daniel Davis

もっと簡単... ​​day(eomonth(@Date))を試してください

18
Javier
--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を作成します...

11
Brimstedt

私はお勧めします:

SELECT DAY(EOMONTH(GETDATE()))
6
gvschijndel

このコードは、現在の月の日数を取得します。

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

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

3
Prashant
   --- 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()))
2
Saikh Rakif
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
pradeep

関数を作成する必要がありますが、それはあなた自身の便宜のためです。これは完璧に機能し、この関数を使用した誤った計算には遭遇しませんでした。

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か月を追加し、日数を減算して、結果の日コンポーネントを取得する必要があります。

1
an40us

解決策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
Phillip Copley

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

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
Stan Scott
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 add_months(trunc(sysdate,'MM'),1) -  trunc(sysdate,'MM') from dual;
1
kritika
SELECT DAY(SUBDATE(ADDDATE(CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-1'), INTERVAL 1 MONTH), INTERVAL 1 DAY))

Nice 'n' Simpleで、関数を作成する必要はありません

0
Paul
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]
0
Danyil Vlasov

ここに別のものがあります...

Select Day(DateAdd(day, -Day(DateAdd(month, 1, getdate())), 
                         DateAdd(month, 1, getdate())))
0
Charles Bretana

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

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
DanielM

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
AbhishekT

を取得するには。 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
VSV AdityaSarma

私は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
feihtthief