Sql Server中的日期函数有很多,总结性的一次性看很多函数也很难记住几个,只有和实际问题相结合使用后才可以记得牢,今天就遇到了一个实际的问题,把一年中的第几天转换成日期?刚拿到这个问题就满脑子疑问,为什么当时记录不直接记录日期而是记录天数?也不管那么多了,就开始在网上查各种时间函数,最后发现DATEADD()函数可以解决这个问题。
下图是数据库里记录的格式,意思是2020年的第148天,现在需要计算2020年的第148天是几月几日:
DATEADD() 函数在日期中添加或减去指定的时间间隔。DATEADD()函数的参数介绍在
https://www.w3school.com.cn/sql/func_dateadd.asp
现在我们传的参数是
DATEADD(DD,cast(RIGHT(LLBJD8,3) as int)-1,'2016-01-01')
# DD的意思是以天为单位
# cast(RIGHT(LLBJD8,3) as int)-1的意思是取得LLBJD8字段的
# 后三位,然后转换成int,再减一天就是2016年1月1日后第五天
# 而不是1月1日后再加5天
# '2016-01-01'这个字段是开始日期
完整的查询
select distinct [LLBJD8],
RIGHT(LLBJD8,3) as days,
LEFT(LLBJD8,4) as years,
case when LEFT(LLBJD8,4) = 2014 then DATEADD(DD,cast(RIGHT(LLBJD8,3) as int)-1,'2014-01-01')
when LEFT(LLBJD8,4) = 2015 then DATEADD(DD,cast(RIGHT(LLBJD8,3) as int)-1,'2015-01-01')
when LEFT(LLBJD8,4) = 2016 then DATEADD(DD,cast(RIGHT(LLBJD8,3) as int)-1,'2016-01-01')
when LEFT(LLBJD8,4) = 2017 then DATEADD(DD,cast(RIGHT(LLBJD8,3) as int)-1,'2017-01-01')
when LEFT(LLBJD8,4) = 2018 then DATEADD(DD,cast(RIGHT(LLBJD8,3) as int)-1,'2018-01-01')
when LEFT(LLBJD8,4) = 2019 then DATEADD(DD,cast(RIGHT(LLBJD8,3) as int)-1,'2019-01-01')
when LEFT(LLBJD8,4) = 2020 then DATEADD(DD,cast(RIGHT(LLBJD8,3) as int)-1,'2020-01-01')
when LEFT(LLBJD8,4) = 2021 then DATEADD(DD,cast(RIGHT(LLBJD8,3) as int)-1,'2021-01-01')
end as 日期
FROM [test_table]
查询结果
LLBJD8 days years 日期
2015081 081 2015 2015-03-22 00:00:00.000
2015193 193 2015 2015-07-12 00:00:00.000
2015340 340 2015 2015-12-06 00:00:00.000
2015365 365 2015 2015-12-31 00:00:00.000
2016030 030 2016 2016-01-30 00:00:00.000
2016031 031 2016 2016-01-31 00:00:00.000
2016033 033 2016 2016-02-02 00:00:00.000
.
.
.