SQL Server 将儒略日期CYYDDD转换为DD/MM/YYYY

31moq8wy  于 2022-12-22  发布在  其他
关注(0)|答案(3)|浏览(172)

我在SQL Server的表中有一列以儒略格式(CYYDDD)存储日期。我正在该字段上运行选择SQL,希望将日期格式转换为DD/MM/YYYY。
我尝试了一些SQL格式转换,但没有一个给予我一个正确的输出

DATEADD(dd, (@jdate - ((@jdate/1000) * 1000)) - 1, dateadd(yy, @jdate/1000, 0))

DATEADD(year, XHUPMJ / 1000, 0) + DATEADD(day, XHUPMJ % 1000, 0) - 1

希望以DD/MM/YYYY格式显示日期输出,且后面没有任何0
列中的儒略日期值为115351,我希望它转换为17/12/2015

dnph8jn4

dnph8jn41#

我从这个site中找到了一个示例代码,用于将儒略日期转换为DD/MM/YYYY格式

DECLARE @Sample AS VARCHAR(6) = '115351'
SELECT CONVERT(VARCHAR(10), DATEADD(DAY, CONVERT(INT, @Sample) - ((1000*(CONVERT(INT, @Sample)/1000)))-1, DATEADD(YEAR, CONVERT(INT, @Sample/1000), '1 Jan 1900')), 103) AS Result

它将转换2015年的第351天,因此结果将为17/12/2015
Demo on db<>fiddle

    • 更新日期:**

正如cars10m在评论中建议的那样,使用% Modulus运算符,上面的查询可以简化为

DECLARE @Sample AS VARCHAR(6) = '115351'
SELECT CONVERT(VARCHAR(10), DATEADD(DAY, CONVERT(INT, @Sample) % 1000 -1, DATEADD(YEAR, CONVERT(INT, @Sample/1000), '1 Jan 1900')), 103) AS Result
new9mtju

new9mtju2#

这就是你想要的答案吗?

SELECT DATEADD(day, CAST(RIGHT(Variable,3) AS int) / 1, CONVERT(datetime,LEFT(Variable,2) + '0101', 103))
d5vmydt9

d5vmydt93#

只是把我的旧帽子扔到一个旧戒指里。这是@Arulkumar发布的内容的变体,但不需要任何INT转换,因为它以INT开始。

--===== This would be the parameter for an iTVF.
DECLARE @JdeDate INT = 115351    
;
--===== Formula to convert the JDE date to a normal DATETIME and then format it to 
     -- If you want it to be a DATE datatype, convert it one more time.
     -- "-1" is the DATE SERIAL NUMBER for the day before 1900-01-01, which effective subtracts 1 day.
 SELECT [DD/MM/YYYY] = CONVERT(CHAR(10),DATEADD(dy,@JdeDate%1000,DATEADD(yy,@JdeDate/1000,-1)),103)
;

如果您的语言设置正确设置了DATEFORMAT,则可能不需要最后的CONVERT。
上面代码的结果如下所示... x1c 0d1x
当然,你可以选择任何你喜欢的列名,我建议把它变成一个iTVF(内联表值函数)。如果你现在有2019年或更好的版本,它可能作为一个内联标量函数工作,但我还没有测试过。

相关问题