Bagaimana menentukan jumlah hari dalam sebulan di SQL Server?

96

Saya perlu menentukan jumlah hari dalam sebulan untuk tanggal tertentu di SQL Server.

Apakah ada fungsi bawaan? Jika tidak, apa yang harus saya gunakan sebagai fungsi yang ditentukan pengguna?

Bahkan Mien
sumber

Jawaban:

115

Anda dapat menggunakan yang berikut ini dengan hari pertama bulan yang ditentukan:

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

Untuk membuatnya bekerja untuk setiap tanggal:

datediff(day, dateadd(day, 1-day(@date), @date),
              dateadd(month, 1, dateadd(day, 1-day(@date), @date)))
Mehrdad Afshari
sumber
2
Seperti yang dikatakan Stan, ini akan memberikan hasil yang tidak akurat dalam beberapa kasus
DJ.
3
bukankah maksud Anda: dateiff (day, dateadd (day, 1-day (@date), @date), dateadd (bulan, 1, dateadd (hari, 1-hari (@date), @date)))
feihtthief
3
Ini kasus sudut yang jarang terjadi, tetapi saya baru saja tersandung: Ini akan membuat kesalahan untuk Desember 9999.
Heinzi
1
Ini tidak bekerja untuk tanggal mana pun di Desember 9999. Anda mendapatkan melimpah pada jenis tanggal. Ini bekerja untuk saya di 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
bradwilder31415
2
Semua solusi yang disebutkan di sini tidak sebanding dengan keanggunan jawaban @Mikael Eriksson . Itu berfungsi setiap kali tanggal yang valid diberikan tanpa solusi gila untuk kasus-kasus khusus dan merupakan kode yang jauh lebih sederhana - Saya sangat merekomendasikan siapa pun di T-SQL untuk mendapatkan daykomponen eomonthoutput.
bsplosion
149

Di SQL Server 2012 Anda dapat menggunakan EOMONTH (Transact-SQL) untuk mendapatkan hari terakhir setiap bulan dan kemudian Anda dapat menggunakan DAY (Transact-SQL) untuk mendapatkan jumlah hari dalam sebulan.

DECLARE @ADate DATETIME

SET @ADate = GETDATE()

SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth
Mikael Eriksson
sumber
1
Dan jika Anda membutuhkan jumlah hari tertentu, Anda juga bisa menggunakan metode DATEFROMPARTS. Kode diatas akan menjadi SELECT DAY (EOMONTH (DATEFROMPARTS (@year, @month, 1))) AS DaysInMonth
nmariot
Keindahan solusi ini berperan jika @ADate adalah nilai kalkulasi yang kompleks! +1
Stefan Steiger
Terima kasih banyak!
Rejwanul Reja
28

Solusi paling elegan: berfungsi untuk @DATE apa pun

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

Lemparkan ke dalam suatu fungsi atau gunakan saja sebaris. Ini menjawab pertanyaan asli tanpa semua sampah tambahan di jawaban lain.

contoh tanggal dari jawaban lain:

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'1/31/2009'),0))) Hasil 31

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'2404-feb-15'),0))) Hasil 29

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'2011-12-22'),0))) Hasil 31

Daniel Davis
sumber
23

Jauh lebih sederhana ... coba day(eomonth(@Date))

Javier
sumber
1
Saya pikir jawaban Anda adalah yang terbaik, sangat sederhana. Terima kasih!
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)))

Secara pribadi, saya akan membuat UDF untuk itu jika tidak ada fungsi bawaan ...

Brimstedt
sumber
5

Saya akan menyarankan:

SELECT DAY(EOMONTH(GETDATE()))
gvschijndel.dll
sumber
datepart tidak mengembalikan jumlah hari dan jawaban Anda juga salah
TheGameiswar
Berhasil untuk saya, tetapi yakin menggunakan fungsi hari akan menjadi jawaban yang lebih bersih
gvschijndel
2
jawaban ini hampir identik dengan jawaban di bawah ini dengan suara 75.
Hila DG
3

Kode ini memberi Anda jumlah hari dalam bulan ini:

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

Ubah getdate()ke tanggal yang Anda perlukan untuk menghitung hari.

Prashant
sumber
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()))
Saikh Rakif
sumber
1

Solusi 1: Temukan jumlah hari dalam bulan apa pun kami saat ini

DECLARE @dt datetime
SET     @dt = getdate()

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

Solusi 2: Temukan jumlah hari dalam kombo bulan-tahun tertentu

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]
Phillip Copley
sumber
1

Anda memang perlu menambahkan fungsi, tapi itu sederhana. Saya menggunakan ini:

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
Himanshu Jansari
sumber
1
Ngomong-ngomong, kombinasi DATEDIFF dan DATEADD tidak selalu berfungsi. Jika Anda memasukkan tanggal 1/31/2009 ke dalamnya, DATEADD akan mengembalikan 2/28/2009 dan DATEDIFF memberi Anda 28, bukan 31.
bagaimana cara memeriksa, maksud saya apa yang harus dilakukan untuk memeriksa hari-hari dalam sebulan ??
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]
Vignesh Anandaraj
sumber
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 dan tidak memerlukan pembuatan fungsi apa pun. Bekerja dengan baik

pradeep
sumber
1

Anda perlu membuat suatu fungsi, tetapi itu untuk kenyamanan Anda sendiri. Ini berfungsi dengan sempurna dan saya tidak pernah menemukan perhitungan yang salah menggunakan fungsi ini.

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

Cara kerjanya: mengurangkan nomor hari tanggal dari tanggal itu sendiri memberi Anda hari terakhir bulan sebelumnya. Jadi, Anda perlu menambahkan satu bulan ke tanggal yang ditentukan, kurangi nomor hari dan dapatkan komponen hari dari hasilnya.

an40us.dll
sumber
1
select add_months(trunc(sysdate,'MM'),1) -  trunc(sysdate,'MM') from dual;
kritika
sumber
0

Saya menaikkan suara Mehrdad, tetapi ini juga berfungsi. :)

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

Untuk menguji

declare @testDT datetime;

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

select dbo.GetDaysInMonth(@testDT)
feihtthief
sumber
0

ini satu lagi ...

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

Saya tahu pertanyaan ini sudah kuno tetapi saya pikir saya akan membagikan apa yang saya gunakan.

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

dan

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

Itu bisa digabungkan untuk membuat satu fungsi untuk mengambil jumlah hari dalam sebulan jika diperlukan.

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

Nice 'n' Simple dan tidak perlu membuat fungsi apa pun

Paul
sumber
Ini untuk SQL Server; Saya belum pernah mendengar tentang suatu subdatefungsi.
LittleBobbyTables - Au Revoir
0

Mehrdad Afshari adalah jawaban yang paling akurat, selain biasanya jawaban ini didasarkan pada pendekatan matematika formal yang diberikan oleh Curtis McEnroe di blognya 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
AbhishekT
sumber
0

Untuk mendapatkan no. hari dalam sebulan kita bisa langsung menggunakan Day () tersedia dalam SQL.

Ikuti tautan yang diposting di akhir jawaban saya untuk SQL Server 2005/2008.

Contoh berikut dan hasilnya adalah dari 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')

Menghasilkan SQL Server SSMS

  (no column name)
1 31

Proses:

Ketika EOMONTH digunakan, apapun format tanggal yang kita gunakan diubah menjadi format DateTime dari SQL-server. Kemudian keluaran tanggal EOMONTH () adalah 2016-12-31 dengan 2016 sebagai Tahun, 12 sebagai Bulan dan 31 sebagai Hari. Output ini ketika diteruskan ke Day () ini memberi Anda jumlah hari total dalam sebulan.

Jika kita ingin mendapatkan hasil instan untuk pengecekan kita bisa langsung menjalankan kode di bawah ini,

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

atau

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

untuk referensi untuk bekerja di SQL Server 2005/2008/2012, ikuti tautan eksternal berikut ...

Temukan Jumlah Hari dalam Satu Bulan di SQL

VSV AdityaSarma
sumber
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';

Hasil: Bulan Ini 31

Bulan Depan 30

ardem
sumber
ini tidak mengembalikan jumlah hari dalam sebulan
ashleedawg
Ya, itu benar. Tetapi hanya untuk SQL Server 2012 dan yang lebih baru
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]
Danyil Vlasov
sumber
0
RETURN day(dateadd(month, 12 * @year + @month - 22800, -1)) 
select day(dateadd(month, 12 * year(date) + month(date) - 22800, -1)) 
Milan Hettner
sumber
-1

Untuk kencan apapun

select DateDiff(Day,@date,DateAdd(month,1,@date))
Sujith
sumber
-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)))
ATUL KALASKAR
sumber
-1

kueri sederhana di SQLServer2012:

pilih hari (('20-05-1951 22:00:00'))

saya menguji untuk banyak tanggal dan selalu mengembalikan hasil yang benar

zied zelfani
sumber
2
SELECT DAY (CAST ('1951-05-20' AS DATE)) mengembalikan 20 yang merupakan bagian hari dari tanggal. Ini tidak mengembalikan jumlah hari di bulan Mei.
Even Mien
-1

pilih first_day = dateadd (hh, -1 * datepart (dd, getdate ()) + 1, getdate ()), last_day = dateadd (hh, -1 * datepart (dd, dateadd (mm, 1, getdate ())) , 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 ())))

ganti tanggal apapun dengan getdate untuk mendapatkan jumlah bulan pada tanggal tersebut

Matricks
sumber
-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
Devilal
sumber
1
Hai dan selamat datang di SO! Meskipun kode dapat berbicara sendiri, memberikan beberapa detail akan membantu meningkatkan kualitas jawaban Anda!
mrun