SQL Найти записи ГДЕ конкретный день в или между dateTimeStart и dateTimeFinish - PullRequest
0 голосов
/ 21 марта 2019

Я хочу запустить запрос, который получает все строки, которые происходят в определенную дату.

enter image description here

Например, запрос должен вернутьОбе эти записи, если я хочу, чтобы все записи, которые произошли на 2019-03-21.

Есть идеи, как это сделать?

Ответы [ 4 ]

1 голос
/ 21 марта 2019

Поскольку у вас есть только DATE (нет времени), и вам нужно проверить с помощью DATETIME, игнорируйте время. Извлеките часть DATE столбца DATETIME и проверьте, находится ли ваша дата между этими датами:

SELECT * FROM table_name
         WHERE '2019-03-21' BETWEEN DATE(StartDateTime) AND DATE(EndDateTime)

Может также работать обратное:

SELECT * FROM table_name
         WHERE CAST('2019-03-21' AS DATETIME) BETWEEN StartDateTime AND EndDateTime
1 голос
/ 21 марта 2019

Нам нужно было бы проверить наложение значений datetime из строк, с начальной и конечной датой timetime

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

     start       end
       |          | 
  s--e |          |             no overlap
  s----e          |             overlap (*)
  s--------e      |             overlap
  s---------------e             overlap
  s------------------e          overlap
       s---e      |             overlap
       s----------e             overlap
       s-------------e          overlap
       |  s---e   |             overlap
       |  s-------e             overlap
       |  s----------e          overlap
       |          s----e        overlap (*)
       |          |  s---e      no overlap

, чтобы найти строки, которые не перекрываются (при условии, что start_date_time всегда предшествует end_date_time, и оба не равны NULL), мы могли бы использовать такой тест:

  WHERE r.end_date_time    <  '2019-03-21 00:00'
     OR r.start_date_time  >= '2019-03-22 00:00'

Если«конец» в строке равен перед началом диапазона, который мы хотим проверить, перекрытия нет.Или, если «начало» в строке равно на или после конца диапазона, перекрытия нет.

Это проверка на любое перекрытие в любое время 3/21/ 2019.(«начало» равно 3/21, а «конец» равно 3/22.)

Обращение этого условия даст нам строки, которые do перекрываются:

  WHERE NOT ( r.end_date_time    <  '2019-03-21 00:00'
           OR r.start_date_time  >= '2019-03-22 00:00'
            )

Что можно переписать:

  WHERE  r.end_date_time    >= '2019-03-21 00:00'
    AND  r.start_date_time  <  '2019-03-22 00:00'

(Обратите внимание, что нам нужно более сложное условие, если значения start_date_time и / или end_date_time могут быть равны NULL, или если end_date_time может быть раньше start_date_time.)

0 голосов
/ 21 марта 2019

Вы хотите:

where '2019-03-21' <= date(enddatetime) and
      '2019-03-21' >= date(startDatetime)

Однако наиболее эффективным способом написания запроса будет:

where enddatetime >= date('2019-03-21') and
      startdatetime < date('2019-03-21') + interval '1 day'
0 голосов
/ 21 марта 2019

Вы можете использовать функцию даты:

SELECT * from table where date(my_date) = '2019-03-21'

Источник: дата

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