而不是 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 年。