将儒略日转换为YYYY-MM-DD格式

5

我已经广泛搜寻,但似乎找不到将儒略日转换为yyyy-mm-dd的方法。

儒略日的格式如下:

儒略日由年份的前两位数字和一年中的第一天(即最后三个数字)组成。

例如,95076代表的是1995年3月17日。其中的95表示年份,076表示这一天是该年的第76天。

15260

我尝试了这个,但它没有起作用:
dateadd(d,(convert(int,LAST_CHANGED_DATE) % 1000)-1, convert(date,(convert(varchar,convert(int,LAST_CHANGED_DATE) /1000 + 1900) + '/1/1'))) as GrgDate

1
可能是将7位数儒略日转换为SQL中的DateTime?的重复问题。 - Giorgi Nakeuri
不,那个JD和我要转换的不一样。我尝试过了,但没有成功。 - Mochael_DLite
向“datetime”列添加一个值导致了溢出。 - Mochael_DLite
9个回答

10
您可以使用datepart()函数选择日期的每个部分。
SELECT DATEPART(yy, 95076), DATEPART(dy, 95076)

+++编辑:我误解了某些事情。以下是我的更正:<++++/p>

很抱歉,我之前的理解有误。这里是我的更正:

SELECT DATEADD(day, CAST(RIGHT('95076',3) AS int) – 1, CONVERT(datetime,LEFT('95076',2) + '0101', 112))

1

编辑:此答案适用于Oracle和MySQL用户
在T-SQL中无法使用此方法。

请使用以下方法:

MAKEDATE(1900 + d / 1000, d % 1000)

例如:

SELECT MAKEDATE(1900 + 95076 / 1000, 95076 % 1000)

这将返回1995年3月17日 00:00:00

SQLFiddle


1
MAKEDATE() 只适用于 Oracle 和 MySql,它不是标准的一部分。 - Joel Coehoorn
@JoelCoehoorn 没错。如果MySQL或Oracle用户出现,我会留下这里的内容。 - Dmytro Shevchenko

0
试一下这个:
DECLARE @jdate int

SET @jdate = 21243

select dateadd(dd, (@jdate - ((@jdate/1000) * 1000)) - 1, dateadd(yy, @jdate/1000+100, 0))

0

这肯定在所有情况下都能工作。

DECLARE @date int
SET @date = 21319
SELECT DATEADD(dd, RIGHT(@date,LEN(@date)-3)-1, DATEADD(yy,LEFT(@date,1)*100 +RIGHT(LEFT(@date,3),2),'1 Jan 1900'))

0

针对 SQL 用户 DECLARE @jdate VARCHAR(10) SET @jdate = 117338 SELECT dateadd(dd, (@jdate - ((@jdate/1000) * 1000)) - 1, dateadd(yy, @jdate/1000, 0))


0
我将20连接到我的JD上,然后运行了以下代码: DATEADD(YEAR, LAST_CHANGE_DATE / 1000 - 1900, LAST_CHANGE_DATE % 1000 - 1) 这给了我结果。谢谢!

0

标准SQL很简单(您可以使用类似的方法处理2位数年份YYMMDD)

声明@julDate int = 2020275

Select 
DateAdd
(
   day
   , Right(@julDate,3)-1
   , Cast((Left(@julDate,4)+'-01-01') as smalldatetime)
)

0

声明 @Julian varchar(7)

声明 @date date

设置 @Julian = 2020277

设置 @Date = Dateadd(day,+ Cast(right(@Julian,3) as int)-1, Cast(left(@Julian,4) + '0101' as Date))

选择 @Date


1
这个问题在四年前已经被回答了。虽然你的答案与被采纳的答案不完全相同,但它非常接近。你可以编辑你的答案,解释为什么这种方法比被采纳的答案更优选,或者至少说明读者何时可能想要使用你的方法?谢谢。 - Jeremy Caney

0

在第一个字符中,您需要指定世纪的值为1或0。例如,SET @date = 21319 应该以1或0为前缀。以下是一个示例,可适用于所有y2k使用情况。

DECLARE @jdate INT 
SET @jdate = 119150 
SELECT DATEADD(dd, (@jdate - ((@jdate/1000) * 1000)) - 1, DATEADD(yy, @jdate/1000, 0))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接