Arhn - архитектура программирования

Столбец Postgres timestamptz и часовой пояс пользователя

После изменения таблицы для использования timestamptz для всех столбцов времени я вижу очень странное поведение при выборе на основе временного диапазона. Когда часовой пояс пользователя UTC, он работает, результат правильный. Если часовой пояс пользователя отличается от UTC, результат равен нулю. Я ожидаю, что результат не должен зависеть от часового пояса пользователя.

set timezone = 'UTC';

select count(*) 
from table1
where modified >= timestamp '2016-07-25 08:00' at time zone 'GB'
  and modified <  timestamp '2016-07-25 09:00' at time zone 'GB'
;

set timezone = 'GB';

select count(*) 
from table1
where modified >= timestamp '2016-07-25 08:00' at time zone 'GB'
  and modified <  timestamp '2016-07-25 09:00' at time zone 'GB'
;

В объяснении запроса я вижу, что Postgres правильно конвертирует константы времени. В первом случае (UTC) это показывает

'2016-07-25 07:00:00+00'::timestamp with timezone 
'2016-07-25 08:00:00+00'::timestamp with timezone

Второй случай (GB) показывает

'2016-07-25 08:00:00+01'::timestamp with timezone 
'2016-07-25 09:00:00+01'::timestamp with timezone

Что еще более странно, он не работает полностью только при разнице во времени в один час. Когда я фильтрую в течение двух часов, с 8 до 10 утра, запрос возвращает ненулевой результат. Это работает так

count(*) from 08:00 to 09:00 - zero
count(*) from 09:00 to 10:00 - zero
count(*) from 08:00 to 10:00 = actual count from 09:00 to 10:00

Похоже, есть ошибка в преобразовании диапазона. Время начала преобразуется, а время окончания — нет.

Интересно, видел ли кто-нибудь эту проблему раньше. Postgres версии 9.3.4 работает на Ubuntu.

Определение столбца modified

...
modified timestamp with time zone NOT NULL DEFAULT now(),
...

ОБЪЯСНЯТЬ

Aggregate  (cost=374.84..374.85 rows=1 width=0)
  Output: count(*)
  ->  Index Only Scan using modified_idx on public.table1  (cost=0.56..362.14 rows=5079 width=0)
        Output: modified
        Index Cond: ((table1.modified >= '2016-07-25 08:00:00+01'::timestamp with time zone) AND (table1.modified < '2016-07-25 09:00:00+01'::timestamp with time zone))

  • Пожалуйста, покажите определение table1. Если столбец modified имеет тип timestamp, его значение изменится при изменении часового пояса. 25.07.2016
  • @LaurenzAlbe Я изменил вопрос с определением столбца 25.07.2016
  • Это выглядит невозможным. Можете ли вы опубликовать вывод EXPLAIN (VERBOSE)? 25.07.2016
  • @LaurenzAlbe, добавлен вывод объяснения 25.07.2016
  • Единственное, что у меня есть, это то, что ваш индекс может быть поврежден. Улучшает ли REINDEX INDEX modified_idx ситуацию? 25.07.2016
  • Кстати, более короткое обозначение: ... where modified <@ tstzrange('2016-07-25 08:00:00 GB', '2016-07-25 10:00:00 GB', '[)') 25.07.2016
  • @LaurenzAlbe да, переиндексация - это решение! После перестроения я вижу правильные результаты запроса. Не могли бы вы отправить это как ответ? 25.07.2016

Ответы:


1

Это кажется невозможным, и единственное объяснение, которое приходит на ум, это то, что индекс поврежден.

REINDEX INDEX modified_idx;

перестроит индекс, надеюсь, это решит проблему.

25.07.2016
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..