SQL如何确定日期月份日期是否包含29,30或31

时间:2011-05-24 14:20:27

标签: sql sql-server sql-server-2005 sql-server-2008

这就是我想要做的。我需要在交易日期添加一个月,以便下个月生效日期 从开始生效日期开始。如果起始有效日是(30,31)不在下个月(例如,2月28日),那么它应该给(3月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'是不是有效的日期。

如何检查下个月的日期是否有开始生效日期。在这个例子中,如何检查2月是否有31。如果它没有31,那么它应该显示'2011-03-01'

非常感谢你的帮助!!!

7 个答案:

答案 0 :(得分:2)

添加一个月后,比较DAY。如果更少,因为DATEADD转到月末(例如1月31日至2月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 :(得分:1)

这应该有效:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

检查一个月的最后一天。

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)

答案 4 :(得分:0)

我们可以为此创建一个标量函数。

CREATE FUNCTION dbo.DaysInMonth(@date DATETIME) RETURNS int
AS
BEGIN
    RETURN (SELECT DAY(DATEADD(m, 1, @date - DAY(@date))))
END

答案 5 :(得分:0)

此SQL语句给出一个月的最后日期,您只需要用所需的datetime变量或列名替换GETDATE()。

DECLARE @lastDateOfMonth AS INT= DATEPART(DD, DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) + 1, 0)));

答案 6 :(得分:-1)

SQL不直接支持这一点。您需要创建一个检查正确日期的函数。看一个例子 Here