Сравнение времени в ClickHouse - PullRequest
1 голос
/ 20 сентября 2019

Может быть, я упускаю что-то простое, но я не мог заставить работать время фильтрации.

Вот мой пример запроса:

select toTimeZone(ts, 'Etc/GMT+2') as z
from (select toDateTime('2019-08-31 20:35:00') AS ts)
where z > '2019-08-31 20:34:00'

Я ожидаю 0 результатов, но получаю:

2019-08-31T18:35:00+00:00

Это ошибка или я неправильно использую toTimeZone() функция?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

ClickHouse хранит DateTime как метку времени Unix - другими словами, без часового пояса.Но часовой пояс учитывается при выполнении sql-запроса:

SELECT
    toDateTime('2019-08-31 20:35:00', 'UTC') AS origin_date,

    toTimeZone(origin_date, 'Etc/GMT+2') AS d1,
    toTypeName(d1) AS type1,
    toUnixTimestamp(d1) AS t1,

    toTimeZone(origin_date, 'UTC') AS d2,
    toTypeName(d2) AS type2,
    toUnixTimestamp(d2) AS t2
FORMAT Vertical

Row 1:
──────
origin_date: 2019-08-31 20:35:00

d1:          2019-08-31 18:35:00
type1:       DateTime('Etc/GMT+2')
t1:          1567283700 # <-- t1 == t2

d2:          2019-08-31 20:35:00
type2:       DateTime('UTC')
t2:          1567283700 # <-- t1 == t2

Ваш запрос работает правильно.

Для «сброса часового пояса» z -дата может бытьиспользовал этот способ:

SELECT toDateTime(toString(toTimeZone(ts, 'Etc/GMT+2'))) AS z
FROM
(
    SELECT toDateTime('2019-08-31 20:35:00') AS ts
)
WHERE z > '2019-08-31 20:34:00'
1 голос
/ 22 сентября 2019

TZ является свойством типа, не имеющего значения

DESCRIBE TABLE
(
    SELECT
        toTimeZone(toDateTime('2019-08-31 20:35:00'), 'Etc/GMT+2') AS x,
        toDateTime('2019-08-31 20:35:00') AS y
)

┌─name─┬─type──────────────────┬─
│ x    │ DateTime('Etc/GMT+2') │
│ y    │ DateTime              │
└──────┴───────────────────────┴─


SELECT toTimeZone(ts, 'Etc/GMT+2') AS z
FROM
(
    SELECT toDateTime('2019-08-31 20:35:00') AS ts
)
WHERE z > toDateTime('2019-08-31 20:34:00', 'Etc/GMT+2')

Ok.

0 rows in set. Elapsed: 0.002 sec.
...