问题描述
||
这就是我想要做的。我需要在交易日期前加上一个月,以便下个月生效
从开始生效日期的同一天开始。如果起始生效日期不是下个月(例如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不直接支持此功能。您将需要创建一个检查正确日期的函数。看一个例子
这里