Как переписать SQL для PostgreSQL

Я пытаюсь переписать две части кода SQL Server в PostgreSQL.

1-й это:

WHERE
    (DATEADD(S, Submit_Date, '1970-01-01')) >= DATEADD(d, -3, GETDATE())
    OR
    (DATEADD(S, Last_Changed_Date, '1970-01-01')) >= DATEADD(d, -3, GETDATE())

Я продолжаю получать сообщение об ошибке относительно буквы S после DATEADD.

2-й это:

WHERE (dbo.Test.[Log] LIKE '%%Status: Closed%%')
GROUP BY dbo.PYR.ID_Number

Мне нужна помощь, чтобы упомянутые строки кода SQL Server были изменены для PostreSQL.

Есть предложения, как они должны быть?

Спасибо.

sqlines.com/postgresql/how-to/dateadd должен помочь вам решить первую проблему
siggemannen 19.07.2023 15:49

Для номера 2 postgre не использует скобки []

siggemannen 19.07.2023 15:50
where to_timestamp(submit_date) >= current_date - interval '3 days' or to_timestamp(last_changed_date) >= current_date - interval '3 days'
Stefanov.sm 19.07.2023 16:23
where test."Log" ~* 'Status: Closed' group by pyr.id_number
Stefanov.sm 19.07.2023 16:26

Отметьте только те rdbms, в которых вы хотите получить свое решение, и предоставьте минимальный воспроизводимый пример, чтобы объяснить, что должен делать запрос.

Dale K 19.07.2023 22:14
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
WHERE
('1970-01-01'::timestamp + interval '1 second' * submit_date)  >= now()+interval '-3 days'
OR
('1970-01-01'::timestamp + interval '1 second' * Last_Changed_date)  >= now()+interval '-3 days'

WHERE  (dbo.Test."Log" ILIKE '%%Status: Closed%%')
GROUP BY dbo.PYR.ID_Number

Если у submit_date и Last_Changed_date есть индексы, то следующий запрос, вероятно, будет работать лучше, чем исходный первый запрос:

WHERE submit_date >= extract(epoch FROM now() - interval '3 days')
   OR Last_Changed_date >= now() - interval '3 days')

Избегайте операций над столбцами в предложении WHERE, чтобы условие можно было проверить (поиск ARGument ABLE); то есть механизм базы данных может сканировать индекс, когда он доступен, вместо последовательного чтения всей таблицы.

Я решил использовать - interval '3 days' вместо + interval '-3 days' для удобочитаемости. Вычитание интервала вместо добавления отрицательного интервала создает меньшую когнитивную нагрузку на читателя, особенно когда - скрыт в строке на некотором расстоянии от +.

Второй запрос можно переписать следующим образом:

WHERE Test."Log" ILIKE '%%Status: Closed%%'
GROUP BY dbo.PYR.ID_Number

Хотя dbo.Test."Log" также работает как ссылка на столбец, лучше включать схему только в ссылку на таблицу в предложении FROM, так как это сводит к минимуму количество изменений, которые необходимо внести в запрос при изменении схемы.

Если это частое условие запроса и это большая таблица, изучите варианты индексации Test."Log".

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