SQL Server'da belirli bir tarih için bir aydaki gün sayısını belirlemem gerekiyor.
Yerleşik bir işlev var mı? Değilse, kullanıcı tanımlı işlev olarak ne kullanmalıyım?
Yanıtlar:
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)))
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
bileşenini almasını şiddetle tavsiye ederim eomonth
.
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
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
--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 ...
Öneririm:
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()))
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]
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
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]
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.
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)
İşte burada bir başkası...
Select Day(DateAdd(day, -Day(DateAdd(month, 1, getdate())),
DateAdd(month, 1, getdate())))
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.
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
subdate
işlevi duymadım .
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
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 ...
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
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)))
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
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
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