我试图在一个日期中将分钟和秒设置为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
语言环境则不会。有人能解释我为什么会这样吗?不应该只改变数据表示吗?
答案 0 :(得分:0)
好的问题解决了,这是我对日期格式的误解:
正如hendrik在他的评论中所建议的,H2使用Java SimpleDateFormat来格式化日期。关注SimpleDateFormat formats,' Y' (大写)代表周年(本周所属的年份)。现在01/01/2017是一个星期天。在意大利语语言环境中(在我的机器上使用),星期日被认为是一周的最后一天(因此这一周属于过去一年,2016年),而在国际标准中(以及en enaleale),星期日是一周的第一天,然后属于2017年。