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

时间:2017-05-09 12:36:38

标签: date h2 formatdatetime

我试图在一个日期中将分钟和秒设置为00,我使用formatdatetime(日期,' 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语言环境则不会。有人能解释我为什么会这样吗?不应该只改变数据表示吗?

1 个答案:

答案 0 :(得分:0)

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

正如hendrik在他的评论中所建议的,H2使用Java SimpleDateFormat来格式化日期。关注SimpleDateFormat formats,' Y' (大写)代表周年(本周所属的年份)。

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