Hive日历日到Julian日期

时间:2018-02-12 23:05:05

标签: hadoop hive hiveql 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日以来的天数。

2 个答案:

答案 0 :(得分:2)

使用@âōōXXůŜ的代码解决了这个问题。我只是做了一点改变,使用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)

我还设置了一个上限函数以避免小数。

答案 1 :(得分:1)

@fernando;我使用此链接来计算它:https://quasar.as.utexas.edu/BillInfo/JulianDatesG.html。请注意,在网站上说(引用):

  

请注意,这总会给你额外的半天时间。那是因为朱利安日从格林威治时间中午开始。这对天文学家来说很方便(直到最近才在晚上才观察到),但这很令人困惑。

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

此警告(再次引用网站):

  

警告:以前的公历日期不保证此计算   至1582年,也不是负朱利安日数。

=========以前不正确的答案=======

@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