Как оптимизировать запрос sqlite datetime для postgresSQL date?

Ссылка скопирована
1 ответ

Здравствуйте!
Если в 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' будет не эквивалентным.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Елена Вебер Ответ

Для оптимизации запроса из 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 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.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно