Как проверить, является ли поле даты / времени записи меньшим, чем текущее время?

0

У меня есть список match который еще не воспроизводится, теперь мне нужно знать, является ли поле datetime которое содержит точный день и час запуска, меньше текущего datetime. Как я могу достичь подобной вещи?

Образец данных

| id | round_id | datetime      
   1     1365     2018-08-19 07:00:00
   2     1365     2018-08-08 11:00:00
   3     1365     2018-07-28 07:00:00
   4     1365     2018-07-27 11:00:00
   5     1365     2018-07-29 07:00:00

так как вы можете видеть, что у нас есть 2 match которые играют в следующем месяце (август), и три match которые играют в текущем месяце July. Таким образом, запрос должен возвращать true потому что почти совпадение, у которого есть минута date, текущая дата, а это означает, что это match уже сыграно. Если вместо этого matches с id: 3, 4, 5 не было в списке, тогда запрос должен возвращать значение false.

Что я пробовал

SELECT COALESCE(MIN(CASE WHEN m2.datetime < NOW() THEN true END), false)
       FROM 'match' m2 WHERE m2.round_id = 1365

query всегда возвращает true, и это действительно странно, может кто-то сказать мне, что я сделал не так?

  • 0
    Без группировки по агрегации (т. Е. Min) будет по всему результирующему набору, и так как ваш min datetime до now (), запрос возвращает true.
Теги:

3 ответа

2
Лучший ответ

Вы даже не нуждаетесь в истинном/ложном, вы можете просто просто ссылаться на него. m2.datetime < NOW() на самом деле является логическим, и добавление IF или CASE оператора просто избыточно:

SELECT m2.datetime < NOW() AS 'is_less_than_today'
FROM 'match' m2 WHERE m2.round_id = 1365

См. Образец скрипта here.

EDIT (вернет 1 истинное или ложное значение):

SELECT SUM(m2.datetime < NOW()) > 0
FROM 'match' m2
WHERE m2.round_id = 1365
GROUP BY m2.round_id

См. Обновленную скрипту here.

  • 0
    но если я хочу вернуть просто один результат, это означает, что почти совпадение имеет меньшую дату, чем текущая?
  • 0
    @Jidic Можете ли вы уточнить, что вы подразумеваете под "несовершеннолетним"? Это не имеет смысла.
Показать ещё 6 комментариев
0

Вам не нужно использовать функцию MIN, просто используйте CASE WHEN может это сделать.

SELECT *,(CASE WHEN m2.datetime < NOW() THEN true else false END)
FROM 'match' m2 
WHERE m2.round_id = 1365
0

Ваша область ошибок

Согласно описанию нет необходимости использовать функцию min но вы использовали ее, в результате она возвращает только минимальную дату, которая составляет 2018-07-27 поэтому вы всегда были true

То, что вам нужно сделать, просто удалить min и вы забыли поместить else в свой запрос, так что положите, что он будет работать отлично, как ваше ожидание

как вы хотите одноразового использования даты min внутри case when, case when

  SELECT CASE WHEN min(m2.datetime )< NOW() THEN true else false END
   FROM 'match' m2 WHERE m2.round_id = 1365
  • 0
    В результате мне не нужен список совпадений, просто чтобы узнать, есть ли одно совпадение, имеющее в качестве поля даты и времени значение, меньшее по сравнению с текущей датой.
  • 0
    тогда в вашем запросе min функция нужна
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню