蜂巢日历日到儒略日期

Hive calendar day to Julian date

我正在尝试将日历日期转换为儒略日期,我在 Teradata 中的做法是:

CAST((TO_CHAR(CURRENT_DATE-1,'J')) AS INT)

我尝试了以下方法:

from_unixtime(unix_timestamp(date_sub(to_date(from_unixtime(unix_timestamp())),1), 'yyyy-MM-dd'),'j')

但是 'j' 不是配置单元的有效模式。

谢谢。

编辑: 我不是要获取 YYYYddd 格式的儒略日期,而是要获取今天 14/02/2018 为 2458164 的儒略日期。

更多编辑: Teradata 中的此函数输出儒略日,即自公元前 4713 年 12 月 31 日以来的天数。

@费尔南多;我用这个 link 来计算它:https://quasar.as.utexas.edu/BillInfo/JulianDatesG.html。请注意,在网站上它说(引用):

Note that this always gives you a half day extra. That is because the Julian Day begins at noon, Greenwich time. This is convenient for astronomers (who until recently only observed at night), but it is confusing.

SELECT 2-CAST(IF(MONTH(date_sub(current_date(),1))<=2, YEAR(date_sub(current_date(),1))-1,YEAR(date_sub(current_date(),1)))/100 AS INT)+CAST(CAST(IF(MONTH(date_sub(current_date(),1))<=2, YEAR(date_sub(current_date(),1))-1,YEAR(date_sub(current_date(),1)))/100 AS INT)/4 AS INT)+DAY(date_sub(current_date(),1))+CAST(365.25*(IF(MONTH(date_sub(current_date(),1))<=2,YEAR(date_sub(current_date(),1))-1, YEAR(date_sub(current_date(),1)))+4716) AS INT)+CAST(30.6001*(IF(MONTH(date_sub(current_date(),1))<=2, MONTH(date_sub(current_date(),1))+12, MONTH(date_sub(current_date(),1)))+1) AS INT)-1524.5;

当前日期减去一天:2018 年 2 月 13 日 结果:2458162.5

还有这个警告(再次引用该网站):

Warning: This computation is not guaranteed for Gregorian dates prior to 1582, nor for negative Julian Day Numbers.

=========上一个错误答案=======

@fernando,请使用date_sub函数,格式为yyyyDDD。希望这可以帮助。谢谢。

Query: select from_unixtime(unix_timestamp(date_sub(current_date, 1),'yyyy-MM-dd'), 'yyyyDDD');

Result: 2018044

where Year: 2018 and J: 044

问题已通过@âńōŋŷXmoůŜ的代码解决。我只是做了一点改动,使用 from_unixtime 和 unix_timestamp 而不是 current_date。

ceiling(2
                    -CAST(IF(MONTH(to_date(from_unixtime(unix_timestamp('04/04/2018','dd/MM/yyyy'),'yyyy-MM-dd')))<=2, YEAR(to_date(from_unixtime(unix_timestamp('04/04/2018','dd/MM/yyyy'),'yyyy-MM-dd')))-1,YEAR(to_date(from_unixtime(unix_timestamp('04/04/2018','dd/MM/yyyy'),'yyyy-MM-dd'))))/100 AS INT)
                    +CAST(CAST(IF(MONTH(to_date(from_unixtime(unix_timestamp('04/04/2018','dd/MM/yyyy'),'yyyy-MM-dd')))<=2, YEAR(to_date(from_unixtime(unix_timestamp('04/04/2018','dd/MM/yyyy'),'yyyy-MM-dd')))-1,YEAR(to_date(from_unixtime(unix_timestamp('04/04/2018','dd/MM/yyyy'),'yyyy-MM-dd'))))/100 AS INT)/4 AS INT)
                    +DAY(to_date(from_unixtime(unix_timestamp('04/04/2018','dd/MM/yyyy'),'yyyy-MM-dd')))
                    +CAST(365.25*(IF(MONTH(to_date(from_unixtime(unix_timestamp('04/04/2018','dd/MM/yyyy'),'yyyy-MM-dd')))<=2,YEAR(to_date(from_unixtime(unix_timestamp('04/04/2018','dd/MM/yyyy'),'yyyy-MM-dd')))-1, YEAR(to_date(from_unixtime(unix_timestamp('04/04/2018','dd/MM/yyyy'),'yyyy-MM-dd'))))+4716) AS INT)
                    +CAST(30.6001*(IF(MONTH(to_date(from_unixtime(unix_timestamp('04/04/2018','dd/MM/yyyy'),'yyyy-MM-dd')))<=2, MONTH(to_date(from_unixtime(unix_timestamp('04/04/2018','dd/MM/yyyy'),'yyyy-MM-dd')))+12, MONTH(to_date(from_unixtime(unix_timestamp('04/04/2018','dd/MM/yyyy'),'yyyy-MM-dd'))))+1) AS INT)
                    -1524.5)

我还放了一个上限函数来避免小数。