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 году.

Другие вопросы по тегам