对于 IBM i Db2(版本 7.2),我已经确定了以下两种用于在儒略日期和日历日期之间进行转换的方法:
-- Julian to Db2 Date (Method 1.0)
DATE(CAST(120050 + 1900000 AS CHAR(7)))
和
-- Db2 Date to Julian (Method 2.0)
1000 * (YEAR(DATE('02/19/2020')) - 1900) + DAYOFYEAR(DATE('02/19/2020'))
更新。我发现第一种方法可以缩短为:
-- Julian to Db2 Date (Method 1.1)
DATE(CHAR(120050 + 1900000))
下面是在 SQL 语句中使用它们的一些示例(以及 IBM 方法):
SELECT
TEST_DATA."DATE"
, TEST_DATA."JULIAN"
, YEAR(TEST_DATA."DATE") AS "YEAR"
, DAYOFYEAR(TEST_DATA."DATE") AS "DAYOFYEAR"
, DATE(DAYS(CONCAT(CAST(INTEGER(1900000 + TEST_DATA."JULIAN") / 1000 AS CHAR(4)), '-01-01')) + MOD(INTEGER(1900000 + TEST_DATA."JULIAN"), 1000) - 1) AS "METHOD_IBM"
, DATE(CAST((TEST_DATA."JULIAN" + 1900000) AS CHAR(7))) AS "METHOD_1.0"
, DATE(CHAR(TEST_DATA."JULIAN" + 1900000)) AS "METHOD_1.1"
, 1000 * (YEAR(TEST_DATA."DATE") - 1900) + DAYOFYEAR(TEST_DATA."DATE") AS "METHOD_2.0"
FROM
TABLE
(
VALUES
(DATE('12/31/1938'), 039365)
, (DATE('12/31/1939'), 039365)
, (DATE('01/01/1940'), 040001)
, (DATE('02/19/2020'), 120050)
, (DATE('2020-01-01'), 119366)
, (DATE('2039-01-01'), 139001)
, (DATE('2039-12-31'), 139365)
, (DATE('2040-01-01'), 140001)
, (DATE('2041-01-15'), 141015)
)
AS TEST_DATA("DATE", "JULIAN")
;
另一个答案建议了突出显示的记录:
用 119366 试试 IBM 的版本和你的版本...
我不知道是否有一个“标准”可以说明这个特定值,但我会说 119366 不是有效的儒略日期,因为 2019 年不是闰年,只有 365 天。我认为允许“溢出”到随后的几年是一种不利的方法,我也没有看到任何遗留应用程序以这种方式存储日期。一般来说,我希望我的查询突出数据中的不规则性,而不是掩盖它们。
请注意,至少有一些数据库标量函数只计算 1940 年到 2039 年之间的日期。我已经包含了这个范围之外的一些日期来演示奇怪的行为。我不确定 IBM 在哪里记录了该行为,但在标量 DAYOFYEAR 函数的文档中没有提到任何内容。