ВЫБЕРИТЕ совпадающие даты из отметки времени с колонкой часового пояса - PullRequest
1 голос
/ 04 октября 2019

У меня есть метка времени со столбцом часового пояса, в котором я хочу выполнить запрос, возвращающий все совпадающие даты. например. Я хочу, чтобы все строки имели временную метку с датой 2019-09-30. Я пытаюсь что-то вроде этого, но не смог понять это:

SELECT * FROM table WHERE
x='1277' AND
date='2019-09-30 21:40:01.316240 +00:00'::DATE;

Ответы [ 4 ]

2 голосов
/ 04 октября 2019

Существует два варианта:

  1. поиск по диапазону:

    WHERE timestampcol >= TIMESTAMPTZ '2019-09-30'
      AND timestampcol < (TIMESTAMPTZ '2019-09-30' + INTERVAL '1 day')
    

    Правильный индекс для быстрого выполнения:

    CREATE INDEX ON atable (timestampcol);
    
  2. преобразование в date:

    WHERE CAST(timestampcol AS date) = '2019-09-30'
    

    Надлежащим индексом для этого поста является

    CREATE INDEX ON atable ((CAST(timestampcol AS date)));
    

Оба метода работают одинаково хорошо. Второй метод имеет более короткое предложение WHERE, но специализированный индекс, который, возможно, не может получить никакой другой запрос.

0 голосов
/ 04 октября 2019

У вас есть несколько вариантов, как они уже упоминались, и они могут различаться в зависимости от типа данных вашего поля с именем «date».

Например,

  1. Включитеполе до даты, возвращая формат «гггг-мм-дд»:

SELECT * FROM table WHERE x='1277' AND date::DATE='2019-09-30';

«дата» сразу после имени поля.

Преобразуйте его в символ и получите 10 символов:

SELECT * FROM table WHERE x='1277' AND LEFT(date::varchar,10)='2019-09-30';

Как и в предыдущем:

SELECT * FROM table WHERE x='1277' AND to_char(date,'yyyymmdd')='20190930';

И есть много других. Для получения более конкретной информации вы должны проверить документацию PostgreSQL, чтобы проверить, какой из них лучше для вас, или опубликовать больше информации, чтобы мы могли догадаться о вашей проблеме.

https://www.postgresql.org/docs/9.4/functions-datetime.html

0 голосов
/ 04 октября 2019

Я не знаком с postgresql, но на следующей странице https://www.postgresql.org/docs/9.1/datatype-datetime.html указано, что существует необязательное значение точности p , которое используется для указания числа дробныхцифры сохраняются в поле секунд. Как был настроен тип данных для вашего поля date ? Сохраняется ли столбец отметки времени в виде восьмибайтового целого числа или числа с плавающей запятой? Если позднее, эффективный предел точности может быть меньше 6. Вся эта информация находится на вышеуказанной связанной странице.

0 голосов
/ 04 октября 2019

Можно использовать такое сопоставление между значением столбца, преобразованным датой, и значением фиксированной даты:

with tab( x, date ) as
(
 select 1277, '2019-09-30 21:40:01.316240 +00:00'::timestamp with time zone union all
 select 1278, '2019-09-29 21:40:01.316240 +00:00'::timestamp with time zone  
)
select *
  from tab
 where date::date = date'2019-09-30';

Демо

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