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.
我正在尝试将日期中的分和秒设置为 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.