Postgresql Где Specifi c Время на дату - PullRequest
0 голосов
/ 28 апреля 2020

У меня такая структура таблицы:

---------------------------
No | Data | create_time 
---------------------------
1 | Data1 | 2020-04-28 00:01:30
2 | Data2 | 2020-04-28 13:04:00
3 | Data3 | 2020-04-27 01:01:30
4 | Data4 | 2020-04-27 14:04:00

Как сделать запрос, но с условием: дата 27 апреля до 28 апреля и время 00:00 до 12:00 Что я пробовал до сих пор:

 SELECT * FROM mytable WHERE ((date(create_time) >= '2020-04-27' AND date(2020-04-27) <= '2020-04-28'
                    AND TO_CHAR(create_time,'HH24:MI:SS') BETWEEN '00:00:00' AND '12:00:00'))

И

SELECT * FROM mytable WHERE ((date(create_time) >= '2020-04-27' AND date(2020-04-27) <= '2020-04-28'
                        AND TO_CHAR(create_time,'HH24:MI:SS') =>'00:00:00' AND TO_CHAR(create_time,'HH24:MI:SS') <= '12:00:00'))

Я хочу добиться того, чтобы я хотел получить данные с этой даты, но время только с 00:00:00 до 12:00. : 00 (24-часовой формат) Но это все еще не работает, Дата верна, но время, которое я хочу, нет.

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Примечание: в этом ответе предполагается, что create_time правильно определено как timestamp.

Вы можете комбинировать условия для части даты и времени:

select *
from mytable
where create_time::date between date '2020-04-27'and date '2020-04-28'
  and create_time::time between time '00:00' and time '12:00'

В качестве альтернативы вы можете использовать условие диапазона без приведения столбца:

select *
from mytable
where create_time >= date '2020-04-27'
  and create_time < date '2020-04-29'
  and create_time::time between time '00:00' and time '12:00'

Может использоваться индекс для create_time.

Если вы не хотите включать время точно в 12:00, вам нужно для изменения условия «время» также:

  and create_time::time >= time '00:00'
  and create_time::time < time '12:00'

Онлайн пример

0 голосов
/ 28 апреля 2020

Попробуйте следующее, и вот демоверсия .

with cte as
(
    select 
        *,
        cast (create_time::timestamp as time) as hour
    from times
)

select
    no, 
    data
from cte
where date(create_time) >= '2020-04-27'
and date(create_time) <= '2020-04-28'
and hour between '00:00:00' and '12:00:00'

Вывод:

| No| Data |  
*----------*
|1 | Data1 | 
|3 | Data3 | 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...