SQL Как определить, содержит ли дата месяц дата 29,30 или 31 - PullRequest
2 голосов
/ 24 мая 2011

Это то, что я пытаюсь сделать.Мне нужно добавить один месяц к дате транзакции, чтобы дата начала следующего месяца начиналась в тот же день, что и дата начала действия.Если начальный день вступления в силу (30, 31) не наступает в следующем месяце (например, 28 февраля), то в качестве следующей даты вступления в силу следует указать (1 марта).Дата транзакции просто означает, какой месяц использовать для добавления месяца.

Например, в следующем месяце с даты вступления в силу отображается штраф, как в этом примере «2011-04-20».

declare @StartEffectiveDate datetime
declare @transactiondate datetime
declare @NextMonthEffectivedate  datetime

set @StartEffectiveDate = '2011-01-20'
set @transactiondate = '2011-03-14'

--calculating next month effective date. incremening transactiondate by 1, but on same day --as the starting effective date.

set @NextMonthEffectivedate = dateadd(month,month(@transactiondate)-month(@StartEffectiveDate)+1,@Starteffectivedate)

Но если @StartEffectiveDate имеет значение «2011-01-31», @transactiondate = «2011-01-30», то результат для даты следующего месяца должен быть «2011-03-01», потому что 2011-02-31 'не является действительной датой.

Как проверить, имеет ли дата следующего месяца начальный день вступления в силу или нет.В этом примере, как проверить, есть ли у Feb 31 или нет.Если у него нет 31, то должно отображаться «2011-03-01»

Большое спасибо за вашу помощь !!!

Ответы [ 7 ]

2 голосов
/ 24 мая 2011

После добавления месяца сравните ДЕНЬ.Если меньше, потому что вместо этого DATEADD подходит к концу месяца (например, с 31 января по 28 февраля), тогда переходите к следующему месяцу

Здесь DATEADD / DATEDIFF пропускается к началу следующего месяца

declare @StartEffectiveDate datetime
set @StartEffectiveDate = '2011-01-20'
SELECT
    CASE
        WHEN DAY(@StartEffectiveDate) <= DAY(DATEADD (MONTH, 1, @StartEffectiveDate)) THEN DATEADD (MONTH, 1, @StartEffectiveDate)
        ELSE DATEADD(day, 1, DATEADD (MONTH, 1, @StartEffectiveDate))
    END

set @StartEffectiveDate = '2011-01-31'
SELECT
    CASE
        WHEN DAY(@StartEffectiveDate) <= DAY(DATEADD (MONTH, 1, @StartEffectiveDate)) THEN DATEADD (MONTH, 1, @StartEffectiveDate)
        ELSE DATEADD(day, 1, DATEADD (MONTH, 1, @StartEffectiveDate))
    END

set @StartEffectiveDate = '2011-02-28'
SELECT
    CASE
        WHEN DAY(@StartEffectiveDate) <= DAY(DATEADD (MONTH, 1, @StartEffectiveDate)) THEN DATEADD (MONTH, 1, @StartEffectiveDate)
        ELSE DATEADD(day, 1, DATEADD (MONTH, 1, @StartEffectiveDate))
    END

Редактировать: нужно добавить только дополнительный день, а не какой-нибудь необычный DATEADD / DATEDIFF ...

1 голос
/ 24 мая 2011

Это должно работать:

declare @StartEffectiveDate datetime
declare @transactiondate datetime
declare @NextMonthEffectivedate  datetime

set @StartEffectiveDate = '20110131'
set @transactiondate = '20110130'

--calculating next month effective date. incremening transactiondate by 1, but on same day --as the starting effective date.

set @NextMonthEffectivedate = dateadd(month,DATEDIFF(month,@StartEffectiveDate,@transactionDate)+1,@StartEffectiveDate)

if DATEPART(day,@StartEffectiveDate) <> DATEPART(day,@NextMonthEffectiveDate)
begin
    --rounding occurred - next month isn't long enough.
    set @NextMonthEffectivedate = DATEADD(day,1,@NextMonthEffectiveDate)
end

print @NextMonthEffectivedate
0 голосов
/ 01 апреля 2019

Этот оператор SQL дает последнюю дату месяца, вам просто нужно заменить GETDATE () на желаемую переменную datetime или имя вашего столбца.

DECLARE @lastDateOfMonth AS INT= DATEPART(DD, DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) + 1, 0)));
0 голосов
/ 06 июня 2011

Мы можем создать для этого скалярную функцию.

CREATE FUNCTION dbo.DaysInMonth(@date DATETIME) RETURNS int
AS
BEGIN
    RETURN (SELECT DAY(DATEADD(m, 1, @date - DAY(@date))))
END
0 голосов
/ 24 мая 2011

Проверка последнего дня месяца.

SELECT day(DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)))

Добавление 1 месяца в дате.

SELECT DATEADD(month,13,getdate());

Проверка первого дня месяца

SELECT CAST(CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '/' + 
                CAST(MONTH(GETDATE()) AS VARCHAR(2)) + '/01' AS DATETIME)
0 голосов
/ 24 мая 2011

SQL напрямую не поддерживает это. Вам нужно будет создать функцию, которая проверяет правильные дни. См пример Здесь

0 голосов
/ 24 мая 2011
select datepart(day, getdate())

Получается день месяца. Итак, вот полный сценарий, хотя я не понял, что вы делаете с @StartEffectiveDate, поэтому я сохранил то же самое:

declare @StartEffectiveDate datetime
declare @transactiondate datetime
declare @NextMonthEffectivedate  datetime

set @StartEffectiveDate = '2011-01-20'
set @transactiondate = '2011-03-30'

--calculating next month effective date. incremening transactiondate by 1, but on same day --as the starting effective date.

set @NextMonthEffectivedate = 
    case
        when datepart(day, @transactiondate) > 28 then dateadd(month,2,dateadd(day,-1*(datepart(day, @transactiondate)-1),@transactiondate))
        else dateadd(month,month(@transactiondate)-month(@StartEffectiveDate)+1,@Starteffectivedate)
    end
select @NextMonthEffectivedate
...