Size: a a a

pgsql – PostgreSQL

2021 July 01

YS

Yaroslav Schekin in pgsql – PostgreSQL
Так я писал совсем о другом подходе, обычном.
И условия при этом записываются таким образом, что всё приводится к timestamptz.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Самое простое — это условие можно просто индексировать, см. https://t.me/pgsql/313978
источник

s

sexst in pgsql – PostgreSQL
Этот вопрос решается на сетевом уровне, не нужно изобретать.
источник

AT

Andrey Tatarnikov in pgsql – PostgreSQL
А можете, пожалуйста, чуть подробнее? Кроме обычных индексов ни с чем не сталкивался. Хоть что в документации искать?)
источник

b

batyrmastyr in pgsql – PostgreSQL
Упс, забыл об этом пути.
источник

IA

Ilya Anfimov in pgsql – PostgreSQL
На клиенте? Ну, с одной стороны всегда (почти) так делаю, с другой — обидно как-то, вроде такой мощный сервер, а пару чисел сложыть не можэт.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Прямо как-то так и пишете CREATE INDEX ON ... (DateOnly(L1.targetdate, 'Europe/Moscow')).
Это описано вот тут: https://www.postgresql.org/docs/current/indexes-expressional.html
Минусы очевидны — по индексу на каждую нужную time zone (использовался бы нормальный подход — этого бы не было). ;(
И да, функции всё равно стоит исправить — то, что Вы показали, всё равно неправильно и кошмарно.
источник

AT

Andrey Tatarnikov in pgsql – PostgreSQL
Если я правильно читаю вот этот док: https://www.postgresql.org/docs/11/indexes-expressional.html

То кончится все необходимостью создать количество индексов по числу используемых таймзон, что скверно по месту
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Хмм... какая разница, на клиенте или на сервере, по большому счёту?
На сервере даже проще, мне кажется (он-то точно умеет с датой/временем работать, а вот клиенты бывают разные).

> вроде такой мощный сервер, а пару чисел сложыть не можэт.

В смысле?
источник

AT

Andrey Tatarnikov in pgsql – PostgreSQL
Чтож, боль и страдания, таков путь интерпрайза. :)

А по поводу кода, если все же в лоб - (current_timestamp at time zone 'zone')::date - имеет право на жизнь?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Кто ж им виноват-то теперь? ;(

> А по поводу кода, если все же в лоб - (current_timestamp at time zone 'zone')::date - имеет право на жизнь?

Да, это один из правильных способов, если не опираться на session time zone. now() = current_timestamp, кстати.
источник

IA

Ilya Anfimov in pgsql – PostgreSQL
Ну, вот ведь, отличный пример. Вычисляешь дату на клиенте, отправляешь на сервер — получаешь простейшую выборку target_date BETWEEN day_begin AND day_end по очевидному индэксу.

Даёшь серверу вычислить - индэксов не напасёшься.
источник

IA

Ilya Anfimov in pgsql – PostgreSQL
Да.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Совершенно то же самое будет (даже лучше, потому что дата на клиенте не обязана совпадать с серверной, и далеко не факт, что клиент работает с timestamps правильно), о чём Вы, я не понимаю?
источник
2021 July 02

IA

Ilya Anfimov in pgsql – PostgreSQL
Ну, как тожэ самое — когда вот пример — или человеку нужно разбирать date_part на клиенте и переворачивать выражэние (= преобразовывать в between ) — или у него нет индэксов.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Я не понимаю, о каком примере речь. В ситуации https://t.me/pgsql/313981 — это их кто-то уже в это втравил, на клиенте ничего уже не исправишь, да и на сервере тоже не очень-то. :(

Что касается нормальной ситуации, то в простых случаях это делается как-то так:
WHERE targetdate >= date_trunc('day', now() - interval '5 days') AND target_date < date_trunc('day', now()))
да и всё. Или речь о какой-то другой ситуации?
источник

IA

Ilya Anfimov in pgsql – PostgreSQL
Это не "кто-то втравил", это самое прямое описание бизнес-логики — даты равны.

И тот факт, что сервер с трудом это понимает, и ему нужно это как-то переписывать с ошыбками — это и есть повод серверу недоверять.
источник

IA

Ilya Anfimov in pgsql – PostgreSQL
С другой стороны — мы тут с Ярославом спорим о достаточно абстрактных вещах, а вам, возможно, никакие индэксы и не нужны. Начните с планов тяжёлых запросов и их ручной оптимизацыи — возможно, вылезут решаемые проблемы.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
> Это не "кто-то втравил", это самое прямое описание бизнес-логики — даты равны.

Да, прямое. Только вот неэффективное (вообще в любом SQL-сервере, насколько я знаю — если ошибаюсь, любопытно увидеть пример).

Если хочется чего-то получше, можно же и определить что-то вроде (это просто "набросок", если что):
CREATE OR REPLACE FUNCTION date_equal(the_date timestamptz, val timestamptz)
RETURNS boolean
LANGUAGE SQL STABLE AS
$function$
SELECT val >= date_trunc('day', the_date) AND val < date_trunc('day', the_date + interval '1 day');
$function$;
И писать уже WHERE date_equal(now(), targetdate), например.

> И тот факт, что сервер с трудом это понимает

Да сервер-то это легко понимает, просто "видеть сквозь" эти функции (что нужно для того, чтобы такое было ещё и эффективно) он (пока?) не умеет.
источник

KZ

Konstantin Zaitsev in pgsql – PostgreSQL
Интересно как Amazon даты хранит?🤪
источник