मुझे SQL सर्वर में दिए गए दिनांक के लिए महीने में दिनों की संख्या निर्धारित करने की आवश्यकता है।
क्या कोई अंतर्निहित कार्य है? यदि नहीं, तो मुझे उपयोगकर्ता-परिभाषित फ़ंक्शन के रूप में क्या उपयोग करना चाहिए?
मुझे SQL सर्वर में दिए गए दिनांक के लिए महीने में दिनों की संख्या निर्धारित करने की आवश्यकता है।
क्या कोई अंतर्निहित कार्य है? यदि नहीं, तो मुझे उपयोगकर्ता-परिभाषित फ़ंक्शन के रूप में क्या उपयोग करना चाहिए?
जवाबों:
आप निर्दिष्ट महीने के पहले दिन के साथ निम्नलिखित का उपयोग कर सकते हैं:
datediff(day, @date, dateadd(month, 1, @date))
इसे हर तारीख के लिए काम करने के लिए:
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
घटक को प्राप्त करने के लिए टी-एसक्यूएल स्टिक पर किसी को भी सलाह देता हूं eomonth
।
SQL Server 2012 में आप महीने के आखिरी दिन को प्राप्त करने के लिए EOMONTH (Transact-SQL) का उपयोग कर सकते हैं और फिर महीने में कई दिनों की संख्या प्राप्त करने के लिए DAY (Transact-SQL) का उपयोग कर सकते हैं ।
DECLARE @ADate DATETIME
SET @ADate = GETDATE()
SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth
सबसे सुरुचिपूर्ण समाधान: किसी भी @ काम के लिए काम करता है
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)))
लौटता है ३१
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)))
लौटता है ३१
--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)))
व्यक्तिगत रूप से हालांकि, मैं इसके लिए एक यूडीएफ बनाऊंगा यदि कोई फ़ंक्शन नहीं है ...
मै सुझाव दूंगा:
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]
आपको एक फ़ंक्शन बनाने की आवश्यकता है, लेकिन यह आपकी अपनी सुविधा के लिए है। यह सही काम करता है और मैंने कभी भी इस फ़ंक्शन का उपयोग करते हुए किसी भी दोषपूर्ण संगणना का सामना नहीं किया।
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
यह कैसे काम करता है: तिथि से दिन की संख्या को घटाकर आपको पिछले महीने का अंतिम दिन प्रदान करता है। तो, आपको दी गई तारीख में एक महीने जोड़ने की जरूरत है, दिन की संख्या घटाएं और परिणाम का दिन घटक प्राप्त करें।
मैंने मेहरदाद को उकसाया, लेकिन यह भी काम करता है। :)
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
यदि आवश्यक हो तो एक महीने में दिनों की संख्या को पुनः प्राप्त करने के लिए एकल फ़ंक्शन बनाने के लिए संयोजन किया जा सकता है।
SELECT DAY(SUBDATE(ADDDATE(CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-1'), INTERVAL 1 MONTH), INTERVAL 1 DAY))
नीस 'एन' सिंपल है और इसे किसी फंक्शन को बनाने की आवश्यकता नहीं है
subdate
फंक्शन के बारे में नहीं सुना ।
मेहरदाद अफशरी का उत्तर सबसे सटीक है, इसके अलावा सामान्य तौर पर यह उत्तर कर्टिस मैकेनरो द्वारा अपने ब्लॉग 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 में उपलब्ध दिन () का उपयोग कर सकते हैं।
SQL सर्वर 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 सर्वर SSMS में परिणाम
(no column name)
1 31
प्रक्रिया:
जब EOMONTH का उपयोग किया जाता है, तो हम जो भी दिनांक प्रारूप का उपयोग करते हैं, वह SQL- सर्वर के DateTime प्रारूप में परिवर्तित हो जाता है। फिर EOMONTH () की दिनांक आउटपुट 2016-12-31 2016 तक वर्ष, 12 महीने के रूप में और 31 दिन के रूप में होगी। यह आउटपुट जब डे में पास हुआ () यह आपको महीने में कुल दिनों की गिनती देता है।
यदि हम जाँच के लिए तत्काल परिणाम प्राप्त करना चाहते हैं तो हम सीधे नीचे दिए गए कोड को चला सकते हैं,
select DAY(EOMONTH(convert(datetime,'08/12/2016',103)))
या
select DAY(EOMONTH(convert(datetime,getdate(),103)))
SQL Server 2005/2008/2012 में काम के संदर्भ के लिए, कृपया निम्नलिखित बाहरी लिंक का अनुसरण करें ...
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';
परिणाम: यह महीना ३१
अगला महीना ३०
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 में सरल क्वेरी:
दिन चुनें ((20-05-1951 22:00:00))
मैंने कई तारीखों का परीक्षण किया और यह हमेशा सही परिणाम देता है
First_day = dateadd (dd, -1 * datepart (dd, getdate ()) + 1, getdate ()), last_day = dateadd (dd, -1 * datepart (dd, datadd (mm, 1, getdate) ())) चुनें , dateadd (mm, 1, getdate ()), no_of_days = 1 + datediff (dd, dateadd (dd, -1 * datepart, dd, getdate) ()) + 1, getdate (), dateadd (dd, -1) * DatePart (दिन, DATEADD (मिमी, 1, getdate ())), DATEADD (मिमी, 1, 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