H2 FORMATDATETIME() неожиданно меняющийся год 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
локаль это не так. Может кто-нибудь объяснить мне, почему это происходит? Разве локаль не должна менять только представление данных?
1 ответ
Хорошо, проблема решена, это было мое недоразумение по форматированию даты:
H2 использует, как предложил hendrik в своем комментарии, Java SimpleDateFormat для форматирования дат. В следующих форматах SimpleDateFormat"Y" (заглавные буквы) обозначает год недели (год, к которому относится неделя).
Теперь 01.01.2017 было воскресенье. В итальянском языке (используется на моей машине) воскресенье считается последним днем недели (таким образом, неделя относится к прошедшему году 2016), в то время как в международном стандарте (и в языке en), воскресенье - это первый день недели, потом принадлежащий 2017 году.