Получить все строки со списком дат между двумя столбцами дат в SQL

#sql #db2

Вопрос:

У меня есть таблица с именем TableA, в которой есть два столбца дат. В настоящее время я использую приведенный ниже запрос для извлечения данных.

«выберите * из таблицы, где IN_Date между датами 1 и 2»

IN_DATE — это входной параметр из процесса

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

Таблица

идентификатор дата 1 дата 2

Комментарии:

1. Вы хотите передать эти даты в виде строки значений, разделенных запятыми (или какими-либо другими), например 2021-01-15, 2021-01-20, ... ? Или как-то еще?

Ответ №1:

Прежде всего, я хочу прояснить это.. каков тип данных столбцов даты и какой формат вы используете для хранения? В каком формате вы передаете IN_DATE ?

Комментарии:

1. IN_Date на данный момент является датой, но будет передан в виде строки дат, разделенной запятыми. Столбцы date1 и date2 будут иметь тип ДАТА

Ответ №2:

Решение вашей проблемы

выберите * из таблицы, где (  (Дата между датами 1 и 2) или (дата между датами 3 и 4) или (дата между датами 5 и 6) )

Комментарии:

1. столбцы являются фиксированными, дата1 и дата2. Вместо этого IN_DATE представляет собой список дат, передаваемых в виде строки, разделенной запятыми.

2. дата 1, дата 2, дата 3, дата 4, дата 5 и дата 6-это список значений даты, а не столбцов. если проблема не решена, пожалуйста, поделитесь примером ожидаемого результата

Ответ №3:

То, что вы пытаетесь сделать, просто невозможно.

Синтаксис предложения between таков:

… выражение 1 МЕЖДУ выражением2 И выражением3 …

Каждое выражение должно разрешаться одним значением (а не списком значений). Кроме того, выражение2 будет Где expressionN-это имя столбца, то единственное значение-это значение в строке, которая в данный момент оценивается.

Это говорит о том, что вы, возможно, подходите к этому неправильно. Пожалуйста, предоставьте некоторые примеры данных и ожидаемые результаты. Это позволит лучше понять, что вы пытаетесь сделать. Также было бы полезно описание того, чего вы хотите достичь, а не описание того, как вы пытаетесь этого достичь.

Ответ №4:

Вы можете использовать подход токенизации строк, как показано ниже, где параметр IN_DATE string содержит список дат, разделенных запятыми, в виде YYYY-MM-DD .

 select * from tableA t where exists (  select 1  from xmltable   (  'for $id in tokenize($s, ",") return lt;igt;{normalize-space ($id)}lt;/igt;'   passing IN_DATE as "s"  columns   tok char(10) path '.'  ) v  where date (to_date (v.tok, 'YYYY-MM-DD')) between t.date1 and t.date2 )