在TSQL中为给定年份设置硬编码的日期和月份

时间:2017-03-28 18:28:07

标签: sql sql-server tsql date

我正在处理一个小型查询,并想要一些格式化日期的帮助

场合

我接受付款日期,根据该日期,我将截止日期设定为今年或下一年的3月31日。因此,如果付款是在1月份,则到期日是当年3月31日,如果是在8月份进行,则是在明年3月31日。 这是我的疑问。

BEGIN
IF DATEPART(MONTH,@paydate) BETWEEN 1 and 3 
UPDATE usrBio
SET ExpDate=DATEPART(YEAR,GETDATE())+'-31'+'-03'
WHERE IDnum =@IDnum
ELSE IF
DATEPART(MONTH,@paydate) BETWEEN 4 and 12
UPDATE usrBio
SET ExpDate=DATEPART(YEAR,GETDATE()+1)+'-31'+'-03'
WHERE IDnum =@IDnum
END

我遇到的问题是我不确定如何设置月份和日期而不是连接到年份字符串,它从年份日期减去,我的结果是1905-06-07 00:00:00.000在那里我期待2017-31-03

2 个答案:

答案 0 :(得分:3)

如果是2012+,请考虑 DateFromParts()

示例1

2018-03-31

退货

Declare @PayDate date = '2017-03-31'

Select DateFromParts(Year(@PayDate)+IIF(Month(@PayDate)>3,1,0),3,31)

----------------------

示例2

2017-03-31

<强>返回

Select DateAdd(YEAR,case when Month(@PayDate)>3 then 1 else 0 end,str(Year(@PayDate),4)+'-03-31')

**

  

编辑 - 2008年

**

insert into attendance (timestamp, status, studentID, scheduleID)
SELECT NOW(), 0, ss.studentID, ss.scheduleID
FROM schedule_students ss
LEFT JOIN attendance a 
  ON ss.scheduleID  = a.scheduleID 
 AND ss.studentID = a.studentID
 AND a.status = 1
WHERE ss.scheduleID = '6004'
  AND a.studentID IS NULL

答案 1 :(得分:2)

问题是您尝试将年份作为数字而不是字符串

DEMO

SELECT CAST( DATEPART(YEAR,GETDATE()+1) 
             AS varchar(5)) +'-03'+'-31'

你可以像这样优化你的逻辑

UPDATE usrBio
SET ExpDate = CAST( CASE WHEN DATEPART(MONTH,@paydate) BETWEEN 1 and 3 
                         THEN DATEPART(YEAR,GETDATE())
                         WHEN DATEPART(MONTH,@paydate) BETWEEN 4 and 12 
                         THEN DATEPART(YEAR,GETDATE()+1) 
                    END AS varchar(4)
                  ) +'-03'+'-31'