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

问题描述

|| 这就是我想要做的。我需要在交易日期前加上一个月,以便下个月生效 从开始生效日期的同一天开始。如果起始生效日期不是下个月(例如2月28日)的(30,31),则应将(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 \'不是有效日期。 如何检查下个月的日期是否具有开始生效的日期。在此示例中,如何检查Feb是否具有31。如果没有31,则应显示“ 2011-03-01” 非常感谢您的帮助!!!     

解决方法

添加一个月后,比较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,@StartEffectiveDate)
        ELSE DATEADD(day,DATEADD (MONTH,@StartEffectiveDate))
    END

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

set @StartEffectiveDate = \'2011-02-28\'
SELECT
    CASE
        WHEN DAY(@StartEffectiveDate) <= DAY(DATEADD (MONTH,@StartEffectiveDate))
    END
编辑:只需要增加一整天,而不是一些花哨的DATEADD / DATEDIFF ...     ,这应该工作:
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,@NextMonthEffectiveDate)
end

print @NextMonthEffectivedate
    ,
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
    ,检查一个月的最后一天。
SELECT day(DATEADD(s,-1,DATEADD(mm,DATEDIFF(m,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)
    ,我们可以为此创建一个标量函数。
CREATE FUNCTION dbo.DaysInMonth(@date DATETIME) RETURNS int
AS
BEGIN
    RETURN (SELECT DAY(DATEADD(m,@date - DAY(@date))))
END
    ,该SQL语句给出一个月的最后日期,您只需要用所需的datetime变量或列名替换GETDATE()。
DECLARE @lastDateOfMonth AS INT= DATEPART(DD,DATEADD(s,GETDATE()) + 1,0)));
    ,SQL不直接支持此功能。您将需要创建一个检查正确日期的函数。看一个例子 这里     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...