Помогите разобраться с значениями DateTime. У нас есть несколько 3 ноды кликхауза. На кождом из них работают процедуры импорта данных в таблицы со структурой:
CREATE TABLE traffic_part (
date Date,
date_time DateTime,
/*
... other fields
*/
)
ENGINE = MergeTree(date, intHash32(ip), (site_id, type_id, item_id, date, intHash32(ip)), 8192);
Для каждой пачки данных на основе такой таблицы создаются таблички с именами ~^traffic_hr_~. На каждой из нод создана сводное представление на движке Merge:
CREATE TABLE traffic_local AS traffic_part ENGINE = Merge(currentDatabase(),'^traffic_hr_');
И существует распределенная таблица, объединяющая все эти данные со всех нод:
CREATE TABLE traffic AS traffic_local ENGINE=Distributed(logs,currentDatabase(),traffic_local,rand());
Все это установлено на железяках где ОС таймзона установлена в EST (
−5 часов от UTC). Данные импортируются через clickhouse-client, который тоже запуcкается в окружении с системной таймзоной.
Теперь к вопросу. Делаем следующие запросы и видим такие результаты:
SELECT date_time
FROM tf.traffic
WHERE (date = '2017-01-29') AND (date_time = '2017-01-29 13:59:59')
LIMIT 10
┌───────────date_time─┐
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
└─────────────────────┘
следующий запрос:
SELECT date_time
FROM tf.traffic
WHERE (date = '2017-01-29') AND (date_time = '2017-01-29 08:59:59')
LIMIT 10
┌───────────date_time─┐
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
└─────────────────────┘
┌───────────date_time─┐
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
└─────────────────────┘
10 rows in set. Elapsed: 0.178 sec. Processed 1.84 million rows, 11.01 MB (10.31 million rows/s., 61.88 MB/s.)
И вот еще:
SELECT date_time
FROM tf.traffic
WHERE date_time = '2017-01-29 08:59:59'
LIMIT 10
┌───────────date_time─┐
│ 2017-01-29 03:59:59 │
│ 2017-01-29 03:59:59 │
└─────────────────────┘
┌───────────date_time─┐
│ 2017-01-29 03:59:59 │
│ 2017-01-29 03:59:59 │
└─────────────────────┘
┌───────────date_time─┐
│ 2017-01-29 03:59:59 │
└─────────────────────┘
┌───────────date_time─┐
│ 2017-01-29 03:59:59 │
└─────────────────────┘
┌───────────date_time─┐
│ 2017-01-29 03:59:59 │
│ 2017-01-29 03:59:59 │
│ 2017-01-29 03:59:59 │
│ 2017-01-29 03:59:59 │
└─────────────────────┘
10 rows in set. Elapsed: 1.376 sec. Processed 7.15 billion rows, 28.58 GB (5.19 billion rows/s., 20.77 GB/s.)
Я понимаю что поле date не сохраняет данные о зоне и содержит данные на момент сохранения - в моем случае EST. Понимаю что поле date_time приводится к UTC из EST и сохраняется. А когда я использую clickhouse-client то для отображения используется локальная таймзона, где он был запущен. Но я не могу понять как выбираются эти строки, таке ощущени что все скачет +/- 5 часов, но какая логика?
Я пробовал использовать функцию toDateTime для приведения к этому типу, но ничего не изменилось:
SELECT date_time
FROM tf.traffic
WHERE date_time = toDateTime('2017-01-29 13:59:59')
LIMIT 10
┌───────────date_time─┐
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
└─────────────────────┘
10 rows in set. Elapsed: 1.187 sec. Processed 6.08 billion rows, 24.34 GB (5.12 billion rows/s., 20.50 GB/s.)
Помогите разобраться. Как же всетаки получить то что написано в WHERE?
Заранее спасибо.
ЗЫ: версия кликхауза
ClickHouse client version 1.1.54023.
Connecting to localhost:9000.
Connected to ClickHouse server version 1.1.54023.