SQL Server에서 한 달의 일 수를 확인하는 방법은 무엇입니까?


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
Stan이 말했듯이 이것은 어떤 경우에는 부정확 한 결과를 줄 것이라고
DJ.

3
의미하지 않습니까 : datediff (day, dateadd (day, 1-day (@date), @date), dateadd (month, 1, dateadd (day, 1-day (@date), @date)))
feihtthief

3
그것은 드문 코너의 경우,하지만 난 그냥 그것으로 발견이 12 월 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
효과적이었습니다

2
여기에 언급 된 모든 솔루션은 @Mikael Eriksson의 대답 의 우아함과 비교할 때 창백 합니다. 이는 틈새 사례에 대한 미친 해결 방법없이 유효한 날짜가 제공 될 때마다 작동하며 훨씬 더 간단한 코드입니다. T-SQL 사용자 dayeomonth출력 구성 요소 를 가져 오는 것이 좋습니다 .
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
Stefan Steiger 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
나는 당신의 대답이 최고라고 생각합니다. 감사!
Ofear

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를 만들 것입니다.


5

내가 제안 할게:

SELECT DAY(EOMONTH(GETDATE()))

날짜 부분은 일의 수를 반환하지 않으며, 당신의 대답은 잘못
TheGameiswar

나를 위해 일하지만, 더 깨끗한 해답이 될 것입니다 일 기능을 사용하십시오
gvschijndel

2
이 답변이 75의 투표로 아래와 거의 동일
Hila DG

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

확인하는 방법, 나는 한 달의 일을 확인하기 위해 무엇을 실행해야 하는지를 의미합니까?
hud

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

작동 원리 : 날짜 자체에서 날짜의 날짜를 빼면 지난 달의 마지막 날이됩니다. 따라서 주어진 날짜에 한 달을 더하고 일 수를 빼서 결과의 일 구성 요소를 가져와야합니다.



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

여기 또 하나 있습니다 ...

Select Day(DateAdd(day, -Day(DateAdd(month, 1, getdate())), 
                         DateAdd(month, 1, getdate())))

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

필요한 경우 한 달의 일 수를 검색하는 단일 함수를 만들기 위해 결합 할 수 있습니다.


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

Nice 'n'Simple 및 기능 생성이 필요하지 않음


이것은 SQL Server 용입니다. subdate함수에 대해 들어 본 적이 없습니다 .
LittleBobbyTables-Au Revoir

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

아니오를 얻으려면. 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-server의 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


이 달의 일 수를 반환하지 않습니다
ashleedawg

네 그렇습니다. 그러나 SQL Server 2012 이상에만 해당
Alberto Cláudio Mandlate

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]

0
RETURN day(dateadd(month, 12 * @year + @month - 22800, -1)) 
select day(dateadd(month, 12 * year(date) + month(date) - 22800, -1)) 

-1

모든 날짜

select DateDiff(Day,@date,DateAdd(month,1,@date))

-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 월의 일수를 반환하지 않습니다.
Even 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.