H2 格式化日期时间() 意外在 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区域设置,则不会。有人可以解释我为什么会发生这种情况吗?区域设置不应该只更改数据呈现吗?

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

正如Hendrik在他的评论中所建议的那样,H2使用Java SimpleDateFormat来格式化日期。按照 SimpleDateFormat 格式,"Y"(大写(代表周年(所属的年份(。

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

相关内容

  • 没有找到相关文章

最新更新