SQL सर्वर में एक महीने में दिनों की संख्या कैसे निर्धारित करें?


95

मुझे SQL सर्वर में दिए गए दिनांक के लिए महीने में दिनों की संख्या निर्धारित करने की आवश्यकता है।

क्या कोई अंतर्निहित कार्य है? यदि नहीं, तो मुझे उपयोगकर्ता-परिभाषित फ़ंक्शन के रूप में क्या उपयोग करना चाहिए?

जवाबों:


115

आप निर्दिष्ट महीने के पहले दिन के साथ निम्नलिखित का उपयोग कर सकते हैं:

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

इसे हर तारीख के लिए काम करने के लिए:

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

2
जैसे स्टेन कहता है कि यह कुछ मामलों में गलत परिणाम देगा
डीजे।

3
क्या आपका मतलब यह नहीं है: डेटेड (दिन, डेटीड (दिन, 1-दिन (@ डेट)), @ डेट), डेटेड (महीना, 1, डेटेड (दिन, 1-दिन (@ डेट), @ डेट))
feihtthief 19

3
यह एक दुर्लभ कोने का मामला है, लेकिन मैं बस इसमें फंस गया: यह 9999 दिसंबर के लिए एक त्रुटि फेंक देगा।
हेनजी

1
यह 9999 दिसंबर में किसी भी तारीख के लिए काम नहीं करता है। आप तारीख प्रकार पर अतिप्रवाह करते हैं। इसने 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
यहाँ वर्णित सभी समाधान @Mikael Eriksson के उत्तर की लालित्य की तुलना में पीला है । यह काम करता है जब भी आला मामलों के लिए पागल वर्कअराउंड के बिना एक वैध तारीख प्रदान की जाती है और कहीं अधिक सरल कोड होता है - मैं आउटपुट के dayघटक को प्राप्त करने के लिए टी-एसक्यूएल स्टिक पर किसी को भी सलाह देता हूं eomonth
bsplosion

148

SQL Server 2012 में आप महीने के आखिरी दिन को प्राप्त करने के लिए EOMONTH (Transact-SQL) का उपयोग कर सकते हैं और फिर महीने में कई दिनों की संख्या प्राप्त करने के लिए DAY (Transact-SQL) का उपयोग कर सकते हैं ।

DECLARE @ADate DATETIME

SET @ADate = GETDATE()

SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth

1
और अगर आपको किसी दिए गए दिनों की संख्या की आवश्यकता है, तो आप DATEFROMPARTS विधि का उपयोग भी कर सकते हैं। उपरोक्त कोड SELAY DAY बन जाएगा (EOMONTH (DATEFROMPARTS (@year, @month, 1)) AS DaysInMonth
nmariot

इस समाधान की सुंदरता खेल में आती है यदि @डेट एक जटिल गणना मूल्य है! +1
स्टीफन स्टेगर

आपका बहुत बहुत धन्यवाद!
रिजवानुल रेजा

27

सबसे सुरुचिपूर्ण समाधान: किसी भी @ काम के लिए काम करता है

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))) लौटता है ३१


22

बहुत सरल ... प्रयास करें day(eomonth(@Date))


1
मुझे लगता है कि आपका उत्तर सबसे अच्छा है, इतना आसान है। धन्यवाद!
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)))

व्यक्तिगत रूप से हालांकि, मैं इसके लिए एक यूडीएफ बनाऊंगा यदि कोई फ़ंक्शन नहीं है ...


5

मै सुझाव दूंगा:

SELECT DAY(EOMONTH(GETDATE()))

दिनांकित दिनों की संख्या को वापस नहीं करता है और आपका उत्तर भी गलत है
TheGameiswar

मेरे लिए काम किया है, लेकिन यकीन है कि दिन समारोह का उपयोग एक अधिक स्वच्छ जवाब होगा
gvschijndel

2
यह उत्तर 75 के वोटों के साथ लगभग नीचे के समान है।
हिले डीजी

3

यह कोड आपको चालू माह में दिनों की संख्या देता है:

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

getdate()आपके लिए दिन गिनने की तारीख में बदलाव करें।


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: वर्तमान में हम जिस भी महीने में हैं उस दिन की संख्या ज्ञात करें

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]

1

आपको एक फ़ंक्शन जोड़ने की आवश्यकता है, लेकिन यह एक सरल है। मैं इसका उपयोग करता हूं:

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
DatedIFF और DATEADD का संयोजन, वैसे, हमेशा काम नहीं करता है। यदि आप इसमें 1/31/2009 की तारीख डालते हैं, तो DATEADD 2/28-2009 को वापस आ जाएगा और DatedIFF आपको 31 नहीं, बल्कि 31 देगा।

कैसे जांच करें, मेरा मतलब है कि एक महीने में दिनों की जांच करने के लिए क्या करना है ??
हुद

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))
        )

नाइस सिंपल और किसी फंक्शन्स को बनाने की आवश्यकता नहीं है वर्क फाइन


1

आपको एक फ़ंक्शन बनाने की आवश्यकता है, लेकिन यह आपकी अपनी सुविधा के लिए है। यह सही काम करता है और मैंने कभी भी इस फ़ंक्शन का उपयोग करते हुए किसी भी दोषपूर्ण संगणना का सामना नहीं किया।

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

यह कैसे काम करता है: तिथि से दिन की संख्या को घटाकर आपको पिछले महीने का अंतिम दिन प्रदान करता है। तो, आपको दी गई तारीख में एक महीने जोड़ने की जरूरत है, दिन की संख्या घटाएं और परिणाम का दिन घटक प्राप्त करें।



0

मैंने मेहरदाद को उकसाया, लेकिन यह भी काम करता है। :)

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)


0

मुझे पता है कि यह प्रश्न पुराना है, लेकिन मुझे लगा कि मैं इसका उपयोग कर रहा हूं।

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

यदि आवश्यक हो तो एक महीने में दिनों की संख्या को पुनः प्राप्त करने के लिए एकल फ़ंक्शन बनाने के लिए संयोजन किया जा सकता है।


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

नीस 'एन' सिंपल है और इसे किसी फंक्शन को बनाने की आवश्यकता नहीं है


यह SQL सर्वर के लिए है; मैंने कभी किसी subdateफंक्शन के बारे में नहीं सुना ।
LittleBobbyTables - एयू रेवोइर

0

मेहरदाद अफशरी का उत्तर सबसे सटीक है, इसके अलावा सामान्य तौर पर यह उत्तर कर्टिस मैकेनरो द्वारा अपने ब्लॉग 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

0

न पाने के लिए। महीने में कुछ दिन हम सीधे 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 में काम के संदर्भ के लिए, कृपया निम्नलिखित बाहरी लिंक का अनुसरण करें ...

SQL में एक माह में कई दिनों की संख्या का पता लगाएं


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

परिणाम: यह महीना ३१

अगला महीना ३०


यह महीने में दिनों की संख्या को वापस नहीं करता है
ashleedawg

हाँ यह करता है। लेकिन केवल SQL सर्वर 2012 और इसके बाद के संस्करण के लिए
अल्बर्टो क्लेडियो मंडलेट




-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 में सरल क्वेरी:

दिन चुनें ((20-05-1951 22:00:00))

मैंने कई तारीखों का परीक्षण किया और यह हमेशा सही परिणाम देता है


2
सेलेक्ट DAY (CAST ('1951-05-20' AS DATE)) 20 रिटर्न देता है जो कि तारीख का दिन हिस्सा है। यह मई के महीने में दिनों की संख्या को वापस नहीं करता है।
यहां तक ​​कि मियां

-1

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 ())))

किसी भी तिथि को उस विशेष तिथि में महीनों में से कोई भी पाने के लिए बदलें


-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
नमस्ते और एसओ में आपका स्वागत है! हालाँकि कोड कुछ विवरण प्रदान करने के लिए खुद ही बोल सकता है, जो आपके उत्तर की गुणवत्ता को बेहतर बनाने में मदद करेगा!
श्रुति
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.