SQL:如何生成给定月份和日期的下一个日期

时间:2009-06-23 20:15:20

标签: sql

在我的表中,我有一个月(tinyint)和一天(tinyint)字段。我希望有一个功能,可以在这个月和日期生成这个月和日的下一个日期(包括年份)的日期时间。

因此,如果我有月= 9,日= 7它将产生9/7/2009。
如果我有第1个月,第1天将产生1/1/2010。

4 个答案:

答案 0 :(得分:2)

这样的事情会起作用。这是你的方法的变化,但它没有使用MM / DD / YYYY文字格式,并且它不会爆炸不良输入(无论好坏)。

declare @month tinyint
declare @day tinyint
set @month = 9
set @day = 1

declare @date datetime

-- this could be inlined if desired
set @date = convert(char(4),year(getdate()))+'0101'
set @date = dateadd(month,@month-1,@date)
set @date = dateadd(day,@day-1,@date)

if @date <= getdate()-1
  set @date = dateadd(year,1,@date)

select @date

或者,要以YYYYMMDD格式创建字符串:

set @date = 
  right('0000'+convert(char(4),year(getdate())),4)
+ right('00'+convert(char(2),@month),2)
+ right('00'+convert(char(2),@day),2)

另一种避免文字的方法:

declare @month tinyint
declare @day tinyint
set @month = 6
set @day = 24

declare @date datetime
declare @today datetime

-- get todays date, stripping out the hours and minutes
-- and save the value for later
set @date = floor(convert(float,getdate()))
set @today = @date

-- add the appropriate number of months and days
set @date = dateadd(month,@month-month(@date),@date)
set @date = dateadd(day,@day-day(@date),@date)

-- increment year by 1 if necessary
if @date < @today set @date = dateadd(year,1,@date)

select @date

答案 1 :(得分:1)

到目前为止,这是我的sql示例。我不是很喜欢它......

DECLARE @month tinyint,
    @day tinyint,
    @date datetime

SET @month = 1
SET @day = 1

-- SET DATE TO DATE WITH CURRENT YEAR
SET @date = CONVERT(datetime, CONVERT(varchar,@month) + '/' + CONVERT(varchar,@day) + '/' + CONVERT(varchar,YEAR(GETDATE())))


-- IF DATE IS BEFORE TODAY, ADD ANOTHER YEAR
IF (DATEDIFF(DAY, GETDATE(), @date) < 0)
BEGIN
    SET @date = DATEADD(YEAR, 1, @date)
END

SELECT @date

答案 2 :(得分:1)

这是PostgreSQL的解决方案

your_date_calculated = Year * 10000 + Month * 100 + Day 

给你一个像20090623的日期。

select cast( cast( your_date_calculated as varchar )  as date ) + 1 

答案 3 :(得分:1)

这是我的版本。它的核心只有两行,使用DATEADD函数,它不需要转换到字符串,浮点数或其他任何东西:

DECLARE @Month TINYINT
DECLARE @Day TINYINT

SET @Month = 9
SET @Day = 7

DECLARE @Result DATETIME

SET @Result =
    DATEADD(month, ((YEAR(GETDATE()) - 1900) * 12) + @Month - 1, @Day - 1)
IF (@Result < GETDATE())
    SET @Result = DATEADD(year, 1, @Result)

SELECT @Result