H2 FORMATDATETIME() 在 01/01 意外改变年份

H2 FORMATDATETIME() unexpecting changing year on 01/01

我正在尝试将日期中的分和秒设置为 00,我使用 formatdatetime(date, 'Y-MM-dd HH:00:00') 它在正常日期下工作正常,但尝试使用 formatdatetime('2017-01 -01 12:27:27', 'Y-MM-dd HH:00:00') 结果是 2016-01-01 12:00:00 而不是 2017-01-01 12:00:00。 为什么?

下面是一些示例代码:

CREATE TABLE test_table (
timestamp DATETIME(3) NOT NULL
);

INSERT INTO test_table
VALUES 
('2017-01-01 12:27:27'), 
('2017-01-02 12:27:27'), 
('2017-01-03 12:27:27');

SELECT FORMATDATETIME(timestamp, 'Y-MM-dd HH:00:00')
FROM test_table;

结果是:

FORMATDATETIME(TIMESTAMP, 'Y-MM-dd HH:00:00')  
2016-01-01 12:00:00
2017-01-02 12:00:00
2017-01-03 12:00:00

为什么会出现这种行为?

我尝试使用 H2 1.4.192/JDK 1.7.0_80 和 H2 1.4.195/JRE 1.8.0_74.

SELECT timestamp FROM test_table的输出正常:

TIMESTAMP ▼
2017-01-01 12:27:27.0
2017-01-02 12:27:27.0
2017-01-03 12:27:27.0

编辑: 我找到了问题,似乎是语言环境:

来自SELECT FORMATDATETIME(timestamp, 'Y-MM-dd HH:00:00 z', 'it', 'GMT') FROM test_table的输出:

FORMATDATETIME(TIMESTAMP, 'Y-MM-dd HH:00:00 z', 'it')  
2016-01-01 12:00:00 CET
2017-01-02 12:00:00 CET
2017-01-03 12:00:00 CET

来自 SELECT FORMATDATETIME(timestamp, 'Y-MM-dd HH:00:00 z', 'en', 'GMT') FROM test_table 的输出:

FORMATDATETIME(TIMESTAMP, 'Y-MM-dd HH:00:00 z', 'en')  
2017-01-01 12:00:00 CET
2017-01-02 12:00:00 CET
2017-01-03 12:00:00 CET

对于 it 语言环境,它会在 01/01/2017 减去一年,而对于 en 语言环境则不会。有人可以解释为什么会这样吗?区域设置不应该只更改数据表示吗?

好的问题解决了,这是我对日期格式的误解:

H2 按照 hendrik 在他的评论中的建议,使用 Java SimpleDateFormat 来格式化日期。 SimpleDateFormat formats后面的'Y'(大写)代表week year(星期所属的年份)

现在 01/01/2017 是星期天。在意大利语言环境中(在我的机器上使用),星期日被认为是一周的最后一天(因此该周属于过去一年,2016 年),而在国际标准中(在 en 语言环境中也是如此),星期日是一周的第一天,然后属于2017.