这就是我想要做的。我需要在交易日期添加一个月,以便下个月生效日期 从开始生效日期开始。如果起始有效日是(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'
非常感谢你的帮助!!!
答案 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