Как определить количество дней в месяце в SQL Server? - PullRequest
84 голосов
/ 27 марта 2009

Мне нужно определить количество дней в месяце для данной даты в SQL Server.

Есть ли встроенная функция? Если нет, что я должен использовать в качестве пользовательской функции?

Ответы [ 26 ]

1 голос
/ 27 марта 2009

Вам нужно добавить функцию, но она простая. Я использую это:

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 голос
/ 12 апреля 2019
select add_months(trunc(sysdate,'MM'),1) -  trunc(sysdate,'MM') from dual;
1 голос
/ 18 февраля 2015

Вам нужно создать функцию, но это для вашего удобства. Он отлично работает, и я никогда не сталкивался с ошибочными вычислениями, использующими эту функцию.

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

Как это работает: вычитание номера дня даты из самой даты дает вам последний день предыдущего месяца. Таким образом, вам нужно добавить один месяц к указанной дате, вычесть номер дня и получить компонент дня результата.

1 голос
/ 22 марта 2019
   --- 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()))
0 голосов
/ 31 января 2018
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
0 голосов
/ 10 сентября 2017
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

0 голосов
/ 23 декабря 2011

Я знаю, что этот вопрос старый, но я думал, что поделюсь тем, что я использую.

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 голосов
/ 09 января 2017

выберите first_day = dateadd (dd, -1 * datepart (dd, getdate ()) + 1, getdate ()), LAST_DAY = DateAdd (дд, -1 * DatePart (дд, DateAdd (мм, 1, GETDATE ())), DateAdd (мм, 1, GETDATE ())), no_of_days = 1 + datediff (dd, dateadd (dd, -1 * datepart (dd, getdate ()) + 1, getdate ()), dateadd (dd, -1 * datepart (dd, dateadd (mm, 1, getdate ( ))), DateAdd (мм, 1, GETDATE ()))) * * +1001

замените любую дату на getdate, чтобы получить количество месяцев в этой конкретной дате

0 голосов
/ 08 декабря 2016

Чтобы получить нет. дней в месяце мы можем напрямую использовать Day (), доступный в SQL.

Перейдите по ссылке, размещенной в конце моего ответа на SQL Server 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 Server SSMS

  (no column name)
1 31

Процесс:

Когда используется EOMONTH, какой бы формат даты мы ни использовали, он конвертируется в формат DateTime SQL-сервера. Тогда дата выхода EOMONTH () будет 2016-12-31, где 2016 год - год, 12 - месяц, а 31 - дни. Этот результат при передаче в Day () дает общее количество дней в месяце.

Если мы хотим получить мгновенный результат проверки, мы можем напрямую запустить приведенный ниже код,

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

или

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

для работы в SQL Server 2005/2008/2012, перейдите по следующей внешней ссылке ...

Найти количество дней в месяце в SQL

0 голосов
/ 14 июля 2016

Ответ Мехрдада Афшари является наиболее точным, кроме обычного, этот ответ основан на формальном математическом подходе, представленном Кертисом Макинрой в его блоге 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
...