1

我正在尝试将日期中的分钟和秒设置为 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语言环境,它会在 2017 年 1 月 1 日减去一年,而使用en语言环境则不会。有人可以解释一下为什么会这样吗?语言环境不应该只改变数据表示吗?

4

1 回答 1

0

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

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

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

于 2017-05-12T07:47:54.513 回答