Выбрать данные из диапазона дат в DB2 SQL

У меня возникли проблемы с получением данных в DB2 SQL. У меня есть имя таблицы StProdMoves, и оно содержит такие данные

ProdName | Status  | Brand | Type  | Date(Numeric)
----------+---------+-------+-------+-----------
ORANGE    | 10      |  SBR  |  IN   | 20181217105640
APPLE     | 10      |  SBR  |  IN   | 20181220143520
GARLIC    | 20      |  SBR  |  IN   | 20190107095740
APPLE     | 20      |  JUM  |  OUT  | 20190107121050
ORANGE    | 20      |  AUR  |  OUT  | 20190110164530
ORANGE    | 20      |  AUR  |  IN   | 20190110000000
GARLIC    | 10      |  SBR  |  OUT  | 20190211000000

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

Например, я хочу выбрать товары, которые остались в диапазоне 31/12/2018 и 07/01/2019, а марка = SBR и статус = 10.

Редактировать: Я пытаюсь получить данные с помощью этого запроса, но не все выбранные продукты отображаются в этом диапазоне дат, а затем показывают такой результат:

SELECT * FROM StProdMoves WHERE DATE(TO_DATE(SUBSTR(DIGITS(Date), 1, 8), 'YYYYMMDD')) BETWEEN '31/12/2018' AND '07/01/2019' AND Brand='SBR' AND Status=10

Позже, как ProducName, Status, Brand, DateIn и DateOut, где отображаются все продукты, существующие в эту дату или диапазон дат, например

 ProdName | Status  | Brand |  DateIn  | DateOut
----------+---------+-------+-------+-----------
ORANGE    | 10      |  SBR  | 20181217 | ---
APPLE     | 10      |  SBR  | 20181220 | ---
PEAR      | 10      |  SBR  | 20181120 | 20190106

Укажите также ожидаемый результат. stackoverflow.com/help/mcve

jarlh 07.04.2019 23:47

Каков тип данных столбца Date?

GMB 08.04.2019 00:27

Тип данных столбца Date является числовым, но я могу преобразовать его в Date, используя DATE(TO_DATE(SUBSTR(DIGITS(Date), 1, 8), 'YYYYMMDD'))

Taikun 08.04.2019 00:49

@Taikun: учитывая формат ваших чисел, вы можете просто выполнить числовое сравнение ... Смотрите мой обновленный ответ.

GMB 08.04.2019 01:06

Я обновил информацию, я пытаюсь быть более конкретным.

Taikun 08.04.2019 01:49
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
2 832
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете попробовать следующее

select * from StProdMoves where Date >= '2018-12-31' and Date <= '2019-01-06'

верхняя граница запросов даты/времени (особенно здесь) должна быть эксклюзивной верхней границей, <, или вы будете считать что-либо в полночь дважды: один раз для «текущей» корзины и один раз для «следующей» корзины, когда это показывает вверх.

Clockwork-Muse 08.04.2019 18:51

Этот вопрос касается того, как сформировать предложение WHERE запроса.


Если столбец Date имеет строковый тип данных (например, VARCHAR(n), CHARACTER(n) и т. д.), то, учитывая их формат, можно выполнить сравнение строк, например:

DateColumn >= '2018-12-31' and DateColumn < '2019-01-06'

Если вы на самом деле имеете дело с DATE тип данных, вы можете преобразовать свои строки в соответствующие типы данных перед сравнением, например:

DateColumn >= DATE('2018-12-31') and DateColumn < DATE('2019-01-06')

Если вы имеете дело с TIMESTAMP:

DateColumn >= TIMESTAMP('2018-12-31 00:00:00') AND DateColumn < TIMESTAMP('2019-01-06 00:00:00')

РЕДАКТИРОВАТЬ

Если вы имеете дело с числовым типом данных (как показано в вашем отредактированном вопросе), вы можете просто выполнить числовое сравнение:

DateColumn >= 20181231000000 and DateColumn < 20190106000000

NB: обычно не рекомендуется называть столбцы, например, функцией СУБД или типом данных. Я переименовал ваш столбец с Date на DateColumn в примерах.

DateColumn > 20181231000000 не работает в Db2 для LUW и DB2 для IBM i. Например, следующие работы: DateColumn > timestamp(to_char(20181231000000)). Если ваш последний пример действительно работает, то какая у вас версия Db2 и платформа?
Mark Barinstein 08.04.2019 12:56

@MarkBarinstein: это выражение предназначалось для ответа на случай, когда DateColumn имеет тип данных числовой, а не тип данных, подобный Дата. Разве это не сработает в данном конкретном случае?

GMB 08.04.2019 13:18

Извините, я упустил из виду тип данных DateColumn в вашем примере.

Mark Barinstein 08.04.2019 14:08

Нижняя граница запросов даты/времени (особенно здесь) должна включать нижнюю границу, >=, иначе вы отбросите все до полуночи.

Clockwork-Muse 08.04.2019 18:50
Ответ принят как подходящий

Если у вас есть даты в виде значений Numeric в таком формате, как вы указали, наиболее эффективный способ запроса вашей таблицы с параметрами DATE должен выглядеть следующим образом:

select *
from (
          select 20181217105640 from sysibm.sysdummy1
union all select 20181220143520 from sysibm.sysdummy1
) StProdMoves (DateNumeric)
where 
    DateNumeric > bigint(varchar_format(DATE('2018-12-18'), 'YYYYMMDDHH24MISS'))
and DateNumeric < bigint(varchar_format(DATE('2019-01-06'), 'YYYYMMDDHH24MISS'));

Таким образом, мы переводим Date входные параметры в Numeric временную метку ваших данных.

Нижняя граница запросов даты/времени (особенно здесь) должна включать нижнюю границу, >=, иначе вы отбросите все до полуночи.

Clockwork-Muse 08.04.2019 18:49

Как насчет

SELECT * FROM "StProdMoves"
WHERE "Date(Numeric)" BETWEEN DECIMAL(DATE('2018-12-31')) * 1000000  
                          AND DECIMAL(DATE('2019-01-07')) * 1000000 + 999999

Другие вопросы по теме