104

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

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

4

29 に答える 29

119

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

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

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

datediff(day, dateadd(day, 1-day(@date), @date),
              dateadd(month, 1, dateadd(day, 1-day(@date), @date)))
于 2009-03-27T19:00:08.650 に答える
29

最も洗練されたソリューション: 任意の@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

于 2013-10-25T22:42:26.817 に答える
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を作成します...

于 2009-03-27T19:03:11.623 に答える
3

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

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

getdate()日数をカウントする必要がある日付に変更します。

于 2016-04-28T10:55:49.247 に答える
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))
        )

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

于 2013-04-10T08:39:12.720 に答える
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]
于 2012-08-21T19:34:24.383 に答える
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]
于 2012-03-18T14:34:05.867 に答える
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
于 2009-03-27T19:01:23.530 に答える
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 か月を加算し、日付を減算して、結果の日付部分を取得する必要があります。

于 2015-02-18T12:31:58.853 に答える
1
select add_months(trunc(sysdate,'MM'),1) -  trunc(sysdate,'MM') from dual;
于 2019-04-12T06:42:53.943 に答える
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 か月の日数を取得する単一の関数を作成できます。

于 2011-12-23T04:12:14.140 に答える
0
SELECT DAY(SUBDATE(ADDDATE(CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-1'), INTERVAL 1 MONTH), INTERVAL 1 DAY))

ナイス 'n' シンプルで、関数を作成する必要はありません

于 2012-07-13T13:22:49.273 に答える
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
于 2016-07-14T11:53:00.867 に答える
0

いいえを取得するには。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で月の日数を見つける

于 2016-12-08T07:39:27.730 に答える
-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 に置き換えて、その特定の日付の月数を取得します

于 2017-01-09T05:17:37.007 に答える
-1

任意の日付

select DateDiff(Day,@date,DateAdd(month,1,@date))
于 2013-05-21T14:09:26.270 に答える
-2
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)))
于 2015-01-05T11:42:18.910 に答える