এসকিউএল সার্ভারে এক মাসে কত দিনের সংখ্যা নির্ধারণ করবেন?


97

এসকিউএল সার্ভারে প্রদত্ত তারিখের জন্য আমাকে এক মাসে কত দিনের সংখ্যা নির্ধারণ করতে হবে।

একটি অন্তর্নির্মিত ফাংশন আছে? যদি তা না হয় তবে আমি ব্যবহারকারী-সংজ্ঞায়িত ফাংশন হিসাবে কী ব্যবহার করব?

উত্তর:


116

নির্দিষ্ট মাসের প্রথম দিন সহ আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

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

এটি প্রতিটি তারিখের জন্য কাজ করতে:

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

4
স্ট্যানের মতো এটি কিছু ক্ষেত্রে ভুল ফলাফল দেবে
ডিজে।

4
আপনি কী বোঝাতে চাইছেন না: তারিখ-তারিখ (দিন, তারিখড্ড (দিন, 1-দিন (@ তারিখ), @ তারিখ), তারিখ-তারিখ (মাস, 1, তারিখ-দিন (দিন, 1-দিন (@ তারিখ), @ তারিখ)))
feihtthief

4
এটি একটি বিরল কর্নার কেস, তবে আমি কেবল
এতেই হোঁচট খেয়েছি

4
এটি 9999 ডিসেম্বর কোনও তারিখের জন্য কাজ করে না You আপনি তারিখের ধরণে ওভারফ্লো পান। এটি আমার জন্য এসকিউএল সার্ভারে কাজ করেছে 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

4
@ মিকেল এরিকসনের উত্তরের কমনীয়তার তুলনায় এখানে উল্লিখিত সমস্ত সমাধান ফ্যাকাশে । এটি কার্যকর হয় যখনই কোনও কার্যকর তারিখটি কুলুঙ্গি কাজগুলি ছাড়া কাস্তিবিহীন ক্ষেত্রে সরবরাহ করা হয় এবং এটি আরও সহজ কোড - আমি টি-এসকিউএল স্টিকের যে কাউকে আউটপুটটির dayউপাদান পাওয়ার জন্য সুপারিশ করব eomonth
বিস্ফোরণটি

152

এসকিউএল সার্ভার ২০১২-এ আপনি মাসের শেষ দিনটি পেতে EOMONTH (লেনদেন-এসকিউএল) ব্যবহার করতে পারেন এবং তারপরে আপনি মাসের দিনগুলি পেতে DAY (ট্রানজেক্ট-এসকিউএল) ব্যবহার করতে পারেন ।

DECLARE @ADate DATETIME

SET @ADate = GETDATE()

SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth

4
এবং যদি আপনার প্রদত্ত দিনের সংখ্যা প্রয়োজন হয় তবে আপনি তারিখের পদ্ধতি ব্যবহার করতে পারেন। উপরের কোডটি নির্বাচনের দিন হয়ে যাবে (EOMONTH (DATEFROM31TS (@ear, @month, 1%)) AS ASSsInMonth
নামমারোট

@ অ্যাডেট একটি জটিল গণনা করা মান হলে এই সমাধানটির সৌন্দর্যটি কার্যকর হয়! +1
স্টেফান স্টেইগার 3'18

তোমাকে অনেক ধন্যবাদ!
রেজওয়ানুল রেজা

28

সর্বাধিক মার্জিত সমাধান: যে কোনও @ তারিখের জন্য কাজ করে

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))) 31 রিটার্ন

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))) 31 রিটার্ন


23

অনেক সহজ ... চেষ্টা করুন day(eomonth(@Date))


4
আমি মনে করি আপনার উত্তরটি সবচেয়ে ভাল, এত সহজ। ধন্যবাদ!
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()))

datepart দিনের সংখ্যা ফেরত দেয় না এবং আপনার উত্তর ভুল হয়
TheGameiswar

আমার জন্য কাজ করেছেন, তবে নিশ্চিত
হ'ল

4
এই উত্তরটি 75. ভোট দিয়ে নিচের প্রায় অভিন্ন
Hila ডিজি

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

4
DATEDIFF এবং DATEADD এর সংমিশ্রণ, যাইহোক, সর্বদা কার্যকর হয় না। আপনি যদি এটিতে 1/31/2009 তারিখটি রেখে দেন তবে DATEADD 2/28/2009 ফেরত আসবে এবং DATEDIFF আপনাকে 31 এর পরিবর্তে 28 দিবে

কীভাবে চেক করতে হবে, মানে এক মাসের মধ্যে দিনগুলি পরীক্ষা করার জন্য কী কার্যকর করা উচিত ??
এইচডি

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

এগুলি এক মাসের মধ্যে দিনের সংখ্যা পুনরুদ্ধার করতে একটি ফাংশন তৈরি করতে একত্রিত হতে পারে needed


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

চমৎকার 'এন' সরল এবং কোনও ক্রিয়া তৈরির প্রয়োজন নেই


এটি এসকিউএল সার্ভারের জন্য; আমি কখনও কোন subdateঅনুষ্ঠানের কথা শুনিনি ।
লিটলববি টেবিলস - অউ রিভায়ার

0

মেহরদাদ আফশারি জবাব সর্বাধিক নির্ভুল একটি, স্বাভাবিকতা ছাড়াও এই উত্তরটি কার্টিস ম্যাকেনরো তার ব্লগ https://cmcenroe.me/2014/12/05/days-in-month-forula.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

নং পেতে। এক মাসের বেশিরভাগ দিন আমরা সরাসরি এসকিউএল-তে উপলব্ধ ডে () ব্যবহার করতে পারি।

এসকিউএল সার্ভার 2005/2008 এর জন্য আমার উত্তর শেষে পোস্ট করা লিঙ্কটি অনুসরণ করুন।

নিম্নলিখিত উদাহরণ এবং ফলাফল এসকিউএল 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')

এসকিউএল সার্ভার এসএসএমএসে ফলাফল

  (no column name)
1 31

প্রক্রিয়া:

যখন EOMONTH ব্যবহৃত হয়, আমরা যে তারিখের ফর্ম্যাটটি ব্যবহার করি তা এসকিউএল-সার্ভারের ডেটটাইম বিন্যাসে রূপান্তরিত হয়। তারপরে EOMONTH () এর তারিখ আউটপুট হবে 2016-12-31 বছর হিসাবে 2016, মাস হিসাবে 12 এবং দিন হিসাবে 31 হবে। এই আউটপুট যখন দিন () এ যায় তখন এটি আপনাকে মাসে মোট দিন গণনা দেয়।

আমরা যদি চেক করার জন্য তাত্ক্ষণিক ফলাফল পেতে চাই তবে আমরা সরাসরি নীচের কোডটি চালাতে পারি,

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

বা

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

এসকিউএল সার্ভার 2005/2008/2012 এ কাজের রেফারেন্সের জন্য, দয়া করে নীচের বাহ্যিক লিঙ্কটি অনুসরণ করুন ...

এসকিউএল মাসে এক মাসের মধ্যে দিনগুলি সন্ধান করুন


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

ফলাফল: এই মাসে 31

পরের মাস 30


এটি মাসে
বেশিরভাগ

হ্যাঁ এটা করে. তবে কেবল এসকিউএল সার্ভারের জন্য 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

এসকিউএল সার্ভার ২০১২-তে সাধারণ ক্যোয়ারী:

দিন নির্বাচন করুন ('20-05-1951 22:00:00 '))

আমি অনেক তারিখের জন্য পরীক্ষা করেছি এবং এটি সর্বদা সঠিক ফলাফল দেয়


4
নির্বাচন দিবস (CAST ('1951-05-20' তারিখ হিসাবে)) 20 প্রদান করে যা তারিখের দিন অংশ। এটি মে মাসে দিনের সংখ্যা ফেরায় না।
এমনকি Mien,

-1

প্রথম_দিন = ডেটএডডি (ডিডি, -1 * ডেট পার্ট (ডিডি, গেটডিট ()) + 1, গেটডিট ()), লাস্ট_ডে = ডেটেডিডি (ডিডি, -1 * ডেট পার্ট (ডিডি, ডেটএডডি (মিমি, 1, গেটেট ())) নির্বাচন করুন , ডেটএডিডিডি (মিমি, 1, গেটেটেট ()), ন_ফ_ডেডস = 1 + ডেটেডিফ (ডিডি, ডেটএডিডি (ডিডি, -1 * ডেট পার্ট (ডিডি, গেটডিট ()) + 1, গেটডিট ()), ডেটএডডি (ডিডি, -1) * ডেট পার্ট (ডিডি, ডেটেডিডি (মিমি, 1, গেটেডেট ())), ডেট্যাড্ড (মিমি, 1, গেটডিট ()))

নির্দিষ্ট তারিখে মাসের সংখ্যা না পাওয়ার জন্য কোনও তারিখ গেটেটের সাথে প্রতিস্থাপন করুন


-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

4
হাই এবং তাই আপনাকে স্বাগতম! যদিও কোডটি নিজের জন্য কিছু বিবরণ সরবরাহ করার জন্য কথা বলতে পারে তা আপনার উত্তরের মান উন্নত করতে সহায়তা করবে!
ম্রুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.