SQL Server'da bir aydaki gün sayısı nasıl belirlenir?


Yanıtlar:


116

Aşağıdakileri belirtilen ayın ilk gününde kullanabilirsiniz:

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

Her randevuda çalışmasını sağlamak için:

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

2
Stan'in dediği gibi, bu bazı durumlarda yanlış sonuçlar verecektir
DJ.

3
Şunu mu demek istiyorsun: tarihliiff (gün, dateadd (gün, 1 gün (@tarih), @tarih), tarihadd (ay, 1, tarihadd (gün, 1 gün (@tarih), @tarih))
feihtthief

3
Bu ender rastlanan bir köşe vakası, ama az önce rastladım: Bu Aralık 9999 için bir hata yapacak.
Heinzi

1
Bu, Aralık 9999'daki hiçbir tarih için çalışmaz. Tarih türünde taşma olur. Bu benim için SQL Server 2014'te çalıştı: 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'un cevabının zarafetine kıyasla burada bahsedilen tüm çözümler soluk . Bu, niş durumlar için çılgın geçici çözümler olmadan geçerli bir tarih sağlandığında çalışır ve çok daha basit bir koddur - T-SQL stick kullanan herkese çıktının daybileşenini almasını şiddetle tavsiye ederim eomonth.
bsplosion

152

SQL Server 2012'de ayın son gününü almak için EOMONTH (Transact-SQL) kullanabilir ve ardından ay içindeki gün sayısını almak için GÜN (Transact-SQL) kullanabilirsiniz.

DECLARE @ADate DATETIME

SET @ADate = GETDATE()

SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth

1
Ve belirli bir gün sayısına ihtiyacınız varsa, DATEFROMPARTS yöntemini de kullanabilirsiniz. Yukarıdaki kod SELECT DAY (EOMONTH (DATEFROMPARTS (@year, @month, 1))) AS DaysInMonth
nmariot

@ADate karmaşık bir hesaplanmış değer ise, bu çözümün güzelliği devreye girer! +1
Stefan Steiger

Çok teşekkür ederim!
Rejwanul Reja

28

En zarif çözüm: herhangi bir @DATE için çalışır

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

Bir fonksiyona atın veya sadece satır içi kullanın. Bu, orijinal soruyu, diğer yanıtlarda fazladan önemsiz şey olmadan yanıtlar.

diğer cevaplardan tarih örnekleri:

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'1/31/2009'),0))) 31 döndürür

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'2404-feb-15'),0))) 29 döndürür

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'2011-12-22'),0))) 31 döndürür


23

Çok daha basit ... deneyin day(eomonth(@Date))


1
Bence cevabınız en iyisi, çok basit. Teşekkürler!
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)))

Kişisel olarak, yerleşik bir işlev yoksa bunun için bir UDF yapardım ...


5

Öneririm:

SELECT DAY(EOMONTH(GETDATE()))


Benim için çalıştı, ancak gün işlevini kullanmak kesinlikle daha temiz bir cevap olacaktır
gvschijndel

2
bu cevap 75 oyla aşağıdaki cevapla hemen hemen aynı.
Hila DG

3

Bu kod size mevcut aydaki gün sayısını verir:

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

getdate()Günleri saymanız gereken tarihi değiştirin .


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.Çözüm: Şu anda bulunduğumuz aydaki gün sayısını bulun

DECLARE @dt datetime
SET     @dt = getdate()

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

2.Çözüm: Belirli bir ay-yıl kombinasyonundaki gün sayısını bulun

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

Bir işlev eklemeniz gerekir, ancak bu basit bir işlevdir. Bunu kullanıyorum:

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
Bu arada, DATEDIFF ve DATEADD kombinasyonu her zaman çalışmaz. İçine 1/31/2009 tarihi koyarsanız, DATEADD 2/28/2009 değerini döndürür ve DATEDIFF size 31 yerine 28 değerini verir.

nasıl kontrol edilir, bir aydaki günleri kontrol etmek için ne yapılacağını kastediyorum ??
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))
        )

Nice Simple ve herhangi bir işlev oluşturmayı gerektirmez Work Fine


1

Bir işlev oluşturmanız gerekir, ancak bu sizin rahatınız içindir. Mükemmel çalışıyor ve bu işlevi kullanırken hiçbir zaman hatalı hesaplamayla karşılaşmadım.

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

Nasıl çalışır: Tarihin gün numarasını tarihin kendisinden çıkarmak size önceki ayın son gününü verir. Dolayısıyla, verilen tarihe bir ay eklemeniz, gün numarasını çıkarmanız ve sonucun gün bileşenini almanız gerekir.


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

0

Mehrdad'a oy verdim ama bu da işe yarıyor. :)

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

Test Etmek

declare @testDT datetime;

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

select dbo.GetDaysInMonth(@testDT)

0

İşte burada bir başkası...

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

0

Bu sorunun eski olduğunu biliyorum ama kullandığımı paylaşacağımı düşündüm.

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

ve

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

Bunlar, gerekirse bir aydaki günlerin sayısını almak için tek bir işlev oluşturmak üzere birleştirilebilir.


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

Nice 'n' Simple ve herhangi bir işlev oluşturmayı gerektirmez


Bu SQL Server içindir; Hiç bir subdateişlevi duymadım .
LittleBobbyTables - Au Revoir

0

Mehrdad Afshari yanıtı en doğru olanıdır, her zamanki dışında bu yanıt Curtis McEnroe tarafından https://cmcenroe.me/2014/12/05/days-in-month-formula.html blogunda verilen resmi matematiksel yaklaşıma dayanmaktadır.

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

Hayır almak için. SQL'de bulunan Day () 'yi doğrudan kullanabiliriz.

SQL Server 2005/2008 için cevabımın sonunda yayınlanan bağlantıyı takip edin.

Aşağıdaki örnek ve sonuç SQL 2012'den alınmıştır.

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'de Sonuç

  (no column name)
1 31

Süreç:

EOMONTH kullanıldığında, hangi tarih formatı kullanırsak kullanalım SQL sunucusunun DateTime formatına dönüştürülür. Daha sonra EOMONTH () için tarih çıktısı 2016-12-31 olur ve 2016 Yıl, 12 Ay ve 31 Gün olur. Bu çıktı Day () 'e geçtiğinde size aydaki toplam gün sayısını verir.

Kontrol için anında sonuç almak istiyorsak doğrudan aşağıdaki kodu çalıştırabiliriz,

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

veya

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

SQL Server 2005/2008/2012 ile çalışma referansı için lütfen aşağıdaki harici bağlantıyı izleyin ...

SQL'de Bir Ay İçindeki Gün Sayısı Bulun


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';

sonuç: Bu Ay 31

Gelecek Ay 30


bu ay içindeki gün sayısını döndürmez
ashleedawg

Evet öyle. Ancak yalnızca SQL Server 2012 ve üzeri için
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

Herhangi bir tarih için

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'de basit sorgu:

gün seçin (('20-05-1951 22:00:00'))

Birçok tarih için test ettim ve her zaman doğru bir sonuç veriyor


2
GÜN SEÇ (CAST ('1951-05-20' TARİH OLARAK)), tarihin gün bölümü olan 20 değerini döndürür. Mayıs ayındaki gün sayısını döndürmez.
Mien bile

-1

first_day = dateadd (dd, -1 * datepart (dd, getdate ()) + 1, getdate ()), last_day = dateadd (dd, -1 * datepart (dd, dateadd (mm, 1, getdate ())) seçin , dateadd (mm, 1, getdate ())), no_of_days = 1 + dateiff (dd, dateadd (dd, -1 * datepart (dd, getdate ()) + 1, getdate ()), dateadd (dd, -1 * datepart (dd, dateadd (mm, 1, getdate ())), dateadd (mm, 1, getdate ())))

belirli bir tarihteki ay sayısını almak için herhangi bir tarihi getdate ile değiştirin


-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
Merhaba ve SO'ya hoş geldiniz! Kod kendi adına konuşsa da, bazı ayrıntıların sağlanması yanıtınızın kalitesini artırmaya yardımcı olacaktır!
bay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.