Как получить все строки в течение дня с указанным значением c столбца - PullRequest
0 голосов
/ 13 июля 2020

У меня есть несколько строк в таблице со столбцом с именем «создано», имеющим метку времени в формате «1309494407» . Мне нужно выполнить запрос SQL, чтобы узнать, сколько строк имеет определенное значение столбца с именем «категория» со значением «книга» . В основном мне нужно знать, сколько книг создается каждый день в базе данных.

Как это достигается с помощью PostgreSQL?

Моя схема:

Items(id, category, created)

Это то, что я пробовал до сих пор:

SELECT
    *
FROM
    my_schema.items
WHERE
    (category = 'books' AND TO_TIMESTAMP(created) < NOW() - INTERVAL '1 days')

И это не работает У меня проблема:

функция to_timestamp (с изменяющимся символом) работает не существует

Ответы [ 2 ]

1 голос
/ 13 июля 2020

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

Ваша временная метка выглядит как эпоха Unix. Если да, то вы можете получить желаемое с помощью простой арифметики c:

SELECT floor(i.created / (24 * 60 * 60)) as dy, COUNT(*)
FROM my_schema.items i
WHERE i.category = 'books' 
GROUP BY dy;

Если хотите, вы можете преобразовать это в календарную дату, используя:

SELECT '1970-01-01' + floor(i.created / (24 * 60 * 60)) * interval '1 day' as dy, COUNT(*)
FROM my_schema.items i
WHERE i.category = 'books' 
GROUP BY dy;
0 голосов
/ 14 июля 2020

Какой удивительный пример того, почему эпоха Unix - такой плохой выбор для хранения дат и текстового представления числа при этом. Всегда храните даты / временные метки подходящего типа. При необходимости эпоху легко извлечь из даты, но вывод даты из эпохи - в общем, некрасивый. А фактическая временная метка еще ужаснее. Если вы используете версию 12, вы можете, по крайней мере, зафиксировать дату в самом столбце таблицы, без необходимости изменять код, уже используя существующий столбец. Создайте сгенерированный столбец, который выводит фактическую дату. (Угадайте, что это было бы интересное путешествие туда и обратно, если для даты будет определяться эпоха, а для данной эпохи - получить дату).

alter table items 
  add created_date date generated always as 
      ('1970-01-01'::timestamp + (created::integer/ 86400) * interval '1 day')  
  stored; 

Теперь этот запрос сводится к простому и прямому:

select i.created_date,count(*)
  from my_schema.items i
 where i.category = 'books' 
 group by i.created_date
 order by i.created_date;

Он также имеет дополнительное преимущество, делая доступными все Postgres функции обработки даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...