এসকিউএল সার্ভারে প্রদত্ত তারিখের জন্য আমাকে এক মাসে কত দিনের সংখ্যা নির্ধারণ করতে হবে।
একটি অন্তর্নির্মিত ফাংশন আছে? যদি তা না হয় তবে আমি ব্যবহারকারী-সংজ্ঞায়িত ফাংশন হিসাবে কী ব্যবহার করব?
এসকিউএল সার্ভারে প্রদত্ত তারিখের জন্য আমাকে এক মাসে কত দিনের সংখ্যা নির্ধারণ করতে হবে।
একটি অন্তর্নির্মিত ফাংশন আছে? যদি তা না হয় তবে আমি ব্যবহারকারী-সংজ্ঞায়িত ফাংশন হিসাবে কী ব্যবহার করব?
উত্তর:
নির্দিষ্ট মাসের প্রথম দিন সহ আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:
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
।
এসকিউএল সার্ভার ২০১২-এ আপনি মাসের শেষ দিনটি পেতে EOMONTH (লেনদেন-এসকিউএল) ব্যবহার করতে পারেন এবং তারপরে আপনি মাসের দিনগুলি পেতে DAY (ট্রানজেক্ট-এসকিউএল) ব্যবহার করতে পারেন ।
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)))
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 রিটার্ন
--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
এগুলি এক মাসের মধ্যে দিনের সংখ্যা পুনরুদ্ধার করতে একটি ফাংশন তৈরি করতে একত্রিত হতে পারে needed
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-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
নং পেতে। এক মাসের বেশিরভাগ দিন আমরা সরাসরি এসকিউএল-তে উপলব্ধ ডে () ব্যবহার করতে পারি।
এসকিউএল সার্ভার 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 এ কাজের রেফারেন্সের জন্য, দয়া করে নীচের বাহ্যিক লিঙ্কটি অনুসরণ করুন ...
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)))
এসকিউএল সার্ভার ২০১২-তে সাধারণ ক্যোয়ারী:
দিন নির্বাচন করুন ('20-05-1951 22:00:00 '))
আমি অনেক তারিখের জন্য পরীক্ষা করেছি এবং এটি সর্বদা সঠিক ফলাফল দেয়
প্রথম_দিন = ডেটএডডি (ডিডি, -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