как определить количество дней в месяце в sql server?

<p>мне нужно определить количество дней в месяце для данной даты в sql server.</p><p>есть ли встроенная функция? если нет, что я должен использовать в качестве пользовательской функции?</p>

<p>вы можете использовать следующее с первым днем указанного месяца:</p><pre><code>datediff(day, @date, dateadd(month, 1, @date)) </code></pre><p>чтобы это работало на каждую дату:</p><pre><code>datediff(day, dateadd(day, 1-day(@date), @date), dateadd(month, 1, dateadd(day, 1-day(@date), @date))) </code></pre>

<p>в sql server 2012 вы можете использовать <a href="https://docs.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql">eomonth (transact-sql)</a> , чтобы получить последний день месяца, а затем вы можете использовать <a href="https://docs.microsoft.com/en-us/sql/t-sql/functions/day-transact-sql">day (transact-sql)</a> , чтобы получить количество дней в месяце.</p><pre><code>declare @adate datetime set @adate = getdate() select day(eomonth(@adate)) as daysinmonth </code></pre>

<p>самое элегантное решение: работает для любого <strong><em>@date</em></strong></p><pre><code>day(dateadd(dd,-1,dateadd(mm,datediff(mm,-1,@date),0))) </code></pre><p>добавьте его в функцию или просто используйте его в строке. это отвечает на исходный вопрос без лишнего мусора в других ответах.</p><p>примеры дат из других ответов:</p><p><code>select day(dateadd(dd,-1,dateadd(mm,datediff(mm,-1,'1/31/2009'),0)))</code> <strong><em>возвращает 31</em></strong></p><p><code>select day(dateadd(dd,-1,dateadd(mm,datediff(mm,-1,'2404-feb-15'),0)))</code> <strong><em>возвращает 29</em></strong></p><p><code>select day(dateadd(dd,-1,dateadd(mm,datediff(mm,-1,'2011-12-22'),0)))</code> <strong><em>возвращает 31</em></strong></p>

<p>намного проще ... попробуйте <code>day(eomonth(@date))</code></p>

<pre><code>--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))) </code></pre><p>лично я бы сделал udf для него, если бы не было встроенной функции ...</p>

<p><strong> я бы предложил: </strong></p><pre><code>select day(eomonth(getdate())) </code></pre>

<p>этот код возвращает количество дней в текущем месяце:</p><pre><code>select datediff(dd,getdate(),dateadd(mm,1,getdate())) as datas </code></pre><p>измените <code>getdate()</code> на дату, на которую нужно рассчитывать дни.</p>

<pre><code>select datediff(day, dateadd(day, 0, dateadd(month, ((2013 - 1900) * 12) + 3 - 1, 0)), dateadd(day, 0, dateadd(month, ((2013 - 1900) * 12) + 3, 0)) ) </code></pre><p>nice simple и не требует создания каких-либо функций work fine</p>

<p>вам нужно создать функцию, но это для вашего удобства. он отлично работает, и я никогда не сталкивался с ошибочными вычислениями, использующими эту функцию.</p><pre><code>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 </code></pre><p><b>как это устроено:</b> вычитание числа дня из даты само дает дату последнего дня предыдущего месяца. таким образом, вам нужно добавить один месяц к указанной дате, вычесть номер дня и получить дневную составляющую результата.</p>

<p><strong> решение 1: найдите количество дней в любом месяце, в котором мы сейчас находимся </strong></p><pre><code>declare @dt datetime set @dt = getdate() select @dt as [datetime], day(dateadd(mm, datediff(mm, -1, @dt), -1)) as [days in month] </code></pre><p><strong> решение 2: найти количество дней в данном месячном комбо </strong></p><pre><code>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] </code></pre>

<p>вам нужно добавить функцию, но она простая. я использую это:</p><pre><code>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 </code></pre>

<pre><code>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] </code></pre>

<pre class="lang-sql prettyprint-override"><code>select add\_months(trunc(sysdate,'mm'),1) - trunc(sysdate,'mm') from dual; </code></pre>

<pre><code>select day(subdate(adddate(concat(year(now()), '-', month(now()), '-1'), interval 1 month), interval 1 day)) </code></pre><p>nice 'n' simple и не требует создания каких-либо функций</p>

<p>вот еще один ... </p><pre><code>select day(dateadd(day, -day(dateadd(month, 1, getdate())), dateadd(month, 1, getdate()))) </code></pre>

<p>я знаю, что этот вопрос старый, но я решил поделиться тем, что я использую.</p><pre><code>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 </code></pre><p>а также</p><pre><code>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 </code></pre><p>их можно объединить, чтобы создать единственную функцию для получения количества дней в месяце, если это необходимо.</p>

<p>ответ мехрдада афшари является наиболее точным, помимо обычного, этот ответ основан на формальном математическом подходе, представленном кертисом макинрой в его блоге <a href="https://cmcenroe.me/2014/12/05/days-in-month-formula.html">https://cmcenroe.me/2014/12/05/days-in-month-formula. html</a> </p><pre><code>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 </code></pre>

<p>чтобы получить нет. дней в месяце мы можем напрямую использовать day (), доступный в sql.</p><p>перейдите по ссылке, размещенной в конце моего ответа на sql server 2005/2008.</p><p>следующий пример и результат взяты из sql 2012</p><pre><code>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') </code></pre><p>результат в sql server ssms</p><pre><code> (no column name) 1 31 </code></pre><p>процесс:</p><p>когда используется eomonth, какой бы формат даты мы ни использовали, он конвертируется в формат datetime sql-сервера. тогда выходной значением eomonth () будет 2016-12-31, в котором 2016 - год, 12 - месяц, а 31 - дни при выводе в day () вы получите общее количество дней в месяце.</p><p>если мы хотим получить мгновенный результат проверки, мы можем напрямую запустить приведенный ниже код,</p><pre><code>select day(eomonth(convert(datetime,'08/12/2016',103))) </code></pre><p>или же</p><pre><code>select day(eomonth(convert(datetime,getdate(),103))) </code></pre><p>для работы в sql server 2005/2008/2012 перейдите по следующей внешней ссылке ...</p><p> <a href="https://raresql.com/2013/01/06/sql-server-get-number-of-days-in-month/">найти количество дней в месяце в sql</a> </p>

<pre><code> --- 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())) </code></pre>

<p>я проголосовал за мехрдада, но это тоже работает. :)</p><pre><code>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 </code></pre><p>тестировать</p><pre><code>declare @testdt datetime; set @testdt = '2404-feb-15'; select dbo.getdaysinmonth(@testdt) </code></pre>