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?
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?
Jawaban:
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)))
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
day
komponen eomonth
output.
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
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
--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 ...
Saya akan menyarankan:
SELECT DAY(EOMONTH(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()))
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]
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
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]
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.
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)
ini satu lagi ...
Select Day(DateAdd(day, -Day(DateAdd(month, 1, getdate())),
DateAdd(month, 1, getdate())))
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.
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
subdate
fungsi.
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
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 ...
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
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))
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)))
kueri sederhana di SQLServer2012:
pilih hari (('20-05-1951 22:00:00'))
saya menguji untuk banyak tanggal dan selalu mengembalikan hasil yang benar
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
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