programing

SQL Server에서 한 달 동안의 일수를 확인하는 방법

testmans 2023. 4. 20. 20:08
반응형

SQL Server에서 한 달 동안의 일수를 확인하는 방법

SQL Server에서 특정 날짜의 월 일수를 결정해야 합니다.

내장된 기능이 있나요?그렇지 않은 경우 사용자 정의 함수로 무엇을 사용해야 합니까?

SQL Server 2012에서는 EOMONTH(Transact-SQL)사용하여 월의 마지막 날을 가져오고 DAY(Transact-SQL)사용하여 월의 일 수를 가져올 수 있습니다.

DECLARE @ADate DATETIME

SET @ADate = GETDATE()

SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth

지정된 달의 첫 번째 날에 다음을 사용할 수 있습니다.

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

모든 날짜에 대해 작동하도록 하려면:

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

가장 우아한 솔루션: 모든 @DA에 대응TE

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

--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를 만들고 싶습니다만...

제안합니다.

SELECT DAY(EOMONTH(GETDATE()))

이 코드는 현재 달의 일수를 가져옵니다.

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

getdate()날짜를 세는 날짜까지를 지정합니다.

   --- 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: 현재 월별 일수 검색

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]

기능을 추가해야 하지만 간단한 기능입니다.나는 이것을 사용한다.

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
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]
select  datediff(day, 
        dateadd(day, 0, dateadd(month, ((2013 - 1900) * 12) + 3 - 1, 0)),
        dateadd(day, 0, dateadd(month, ((2013  - 1900) * 12) + 3, 0))
        )

나이스 심플하고 기능을 만들 필요가 없습니다.괜찮습니다.

당신은 기능을 만들어야 하지만, 그것은 당신의 편의를 위한 것입니다.동작은 완벽하고, 이 기능을 사용한 계산 오류는 한 번도 본 적이 없습니다.

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개월을 더하고 일 수를 뺀 후 결과의 일 성분을 가져와야 합니다.

select add_months(trunc(sysdate,'MM'),1) -  trunc(sysdate,'MM') from dual;

메흐다드에게 표를 줬지만 이것도 효과가 있어요:)

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)

여기 또 있어요...

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

이 질문이 오래된 건 알지만 제가 쓰는 걸 공유하려고요.

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개월의 일수를 취득하는 단일 함수를 작성할 수 있습니다.

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

Nice 'n' 단순하며 함수를 만들 필요가 없습니다.

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

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에서 한 달 중 일 수 찾기

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일

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]
RETURN day(dateadd(month, 12 * @year + @month - 22800, -1)) 
select day(dateadd(month, 12 * year(date) + month(date) - 22800, -1)) 

이를 보다 깔끔하게 구현하기 위해서는datefromparts해당 월의 첫 번째 날을 구성하고 그 이후의 날짜를 계산하는 함수입니다.

CREATE FUNCTION [dbo].[fn_DaysInMonth]
(
    @year INT,
    @month INT
)
RETURNS INT
AS
BEGIN

IF @month < 1 OR @month > 12 RETURN NULL;
IF @year < 1753 OR @year > 9998 RETURN NULL;

DECLARE @firstDay DATE = datefromparts(@year, @month, 1);
DECLARE @lastDay DATE = dateadd(month, 1, @firstDay);

RETURN datediff(day, @firstDay, @lastDay);

END
GO

마찬가지로 일수를 1년으로 계산할 수 있습니다.

CREATE FUNCTION [dbo].[fn_DaysInYear]
(
    @year INT
)
RETURNS INT
AS
BEGIN

IF @year < 1753 OR @year > 9998 RETURN NULL;

DECLARE @firstDay DATE = datefromparts(@year, 1, 1);
DECLARE @lastDay DATE = dateadd(year, 1, @firstDay);

RETURN datediff(day, @firstDay, @lastDay);

END
GO

SQL Server EOMONTH 함수를 요일에 중첩하여 월의 마지막 날을 가져옵니다.

select Day(EOMONTH('2020-02-1')) -- Leap Year returns 29
select Day(EOMONTH('2021-02-1')) -- returns 28
select Day(EOMONTH('2021-03-1')) -- returns 31

임의의 날짜

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

first_day=dateadd(dd,-1*datepart(dd,getdate())+1,getdate(), last_day=dateadd(d,-1*datepart()), dateadd(mm,1,getdate()를 선택합니다.

임의의 날짜를 getdate로 대체하여 특정 날짜의 월수를 취득합니다.

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
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)))

SQL Server 2012의 단순 쿼리:

day('20-05-time 22:00:00')를 선택합니다.

여러 날짜를 테스트했는데 항상 정확한 결과가 나옵니다.

언급URL : https://stackoverflow.com/questions/691022/how-to-determine-the-number-of-days-in-a-month-in-sql-server

반응형