Как оптимизировать запрос sqlite datetime для postgresSQL date?
Здравствуйте!
Если в Sqlite все довольно понятно, то у Postgres очень уж трудоемкая документация.
Прошу помочь знающих, как сделать аналогичную функцию на posgresSQL:
Есть данная функция в sqlite использовал datetime. Но к сожалению в постгре она не работает, тк у date есть свои ограничения, но есть ли возможность настроить их аналогично? Чтоб от текущей даты отсчитывался определённый момент времени
import psycopg2 def get_records(self, user_id, within="all"): """Получаем историю о заказах""" if (within == "day"): self.cursor.execute("""SELECT * FROM orders WHERE user_id = %s AND order_date BETWEEN date('now', 'start of day') AND date('now', 'localtime') ORDER BY order_date""", (str(self.get_user_id(user_id)),)) elif (within == "week"): self.cursor.execute("""SELECT * FROM orders WHERE user_id = %s AND order_date BETWEEN date('now', '-6 days') AND date('now', 'localtime') ORDER BY order_date""", (str(self.get_user_id(user_id)),)) elif (within == "mounth"): self.cursor.execute("""SELECT * FROM orders WHERE user_id = %s AND order_date BETWEEN date('now', 'start of month') AND date('now', 'localtime') ORDER BY order_date""",(str(self.get_user_id(user_id)),)) else: self.cursor.execute("""SELECT * FROM orders WHERE user_id = %s ORDER BY order_date""", (str(self.get_user_id(user_id)),)) |
import psycopg2 def get_records(self, user_id, within="all"): """Получаем историю о заказах""" if (within == "day"): self.cursor.execute("""SELECT * FROM orders WHERE user_id = %s AND order_date BETWEEN date('now', 'start of day') AND date('now', 'localtime') ORDER BY order_date""", (str(self.get_user_id(user_id)),)) elif (within == "week"): self.cursor.execute("""SELECT * FROM orders WHERE user_id = %s AND order_date BETWEEN date('now', '-6 days') AND date('now', 'localtime') ORDER BY order_date""", (str(self.get_user_id(user_id)),)) elif (within == "mounth"): self.cursor.execute("""SELECT * FROM orders WHERE user_id = %s AND order_date BETWEEN date('now', 'start of month') AND date('now', 'localtime') ORDER BY order_date""",(str(self.get_user_id(user_id)),)) else: self.cursor.execute("""SELECT * FROM orders WHERE user_id = %s ORDER BY order_date""", (str(self.get_user_id(user_id)),))
Дополнительно:
Текущее время - now()
date_trunc() - округление даты
-- date('now', 'start of day') date_trunc('day', now()) -- date('now', 'start of month') date_trunc('month', now()) -- date('now', '-6 days') now() - INTERVAL '6 days' |
-- date('now', 'start of day') date_trunc('day', now()) -- date('now', 'start of month') date_trunc('month', now()) -- date('now', '-6 days') now() - INTERVAL '6 days'
Ответы:
select current_date, current_date - interval '6 day', date_trunc('month', now()), now(); |
select current_date, current_date - interval '6 day', date_trunc('month', now()), now();
Просто другой набор функций, выберите подходящую.
- current_date - interval '6 day' до дня округлит. У ТС, судя по коду, скорее current_timestamp - interval '6 day'
- я сперва понаписал now() - interval '6 day', потом засомневался и переписал, но что именно здесь делает sqlite проверять не стал
- Melkij, спасибо, не знал, что тут надо фильтр даты переносить в начало( к SELECT), так что Ваше решение тоже помогло)
- Не нужно, это пример запроса для демонстрации, что эти функции возвращают.
Какsqlite> select date('now', '-6 days'); 2021-11-15 sqlite>
sqlite> select date('now', '-6 days'); 2021-11-15 sqlite>
для sqlite. И таки sqlite здесь считает только дату, поэтому now() - INTERVAL '6 days' будет не эквивалентным.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для оптимизации запроса из SQLite, который использует тип данных datetime, для PostgreSQL, который использует тип данных date, необходимо выполнить следующие шаги:
1. Преобразовать тип данных datetime в SQLite в тип данных date, чтобы соответствовать типу данных date в PostgreSQL. Для этого можно использовать функцию date() в SQLite, чтобы извлечь только дату из datetime.
2. Использовать функцию CAST() или ::date в PostgreSQL, чтобы преобразовать тип данных datetime в date.
3. Убедитесь, что индексы на столбцы, используемые в запросе, правильно настроены в обоих базах данных. Индексы могут значительно повысить производительность запросов.
4. При необходимости выполните дополнительную оптимизацию запроса, такую как добавление условий WHERE или использование JOIN для уменьшения объема данных, которые нужно обработать.
Пример кода для преобразования типа данных datetime в SQLite и PostgreSQL:
-- Пример запроса в SQLite SELECT date(datetime_column) as date_column FROM table_name; -- Пример запроса в PostgreSQL SELECT CAST(datetime_column AS DATE) as date_column FROM table_name;
Следуя этим рекомендациям, вы сможете оптимизировать запрос из SQLite, использующий тип данных datetime, для PostgreSQL, который использует тип данных date.