У меня возникли проблемы с получением данных в 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
Каков тип данных столбца Date
?
Тип данных столбца Date является числовым, но я могу преобразовать его в Date, используя DATE(TO_DATE(SUBSTR(DIGITS(Date), 1, 8), 'YYYYMMDD'))
@Taikun: учитывая формат ваших чисел, вы можете просто выполнить числовое сравнение ... Смотрите мой обновленный ответ.
Я обновил информацию, я пытаюсь быть более конкретным.
Вы можете попробовать следующее
select * from StProdMoves where Date >= '2018-12-31' and Date <= '2019-01-06'
верхняя граница запросов даты/времени (особенно здесь) должна быть эксклюзивной верхней границей, <
, или вы будете считать что-либо в полночь дважды: один раз для «текущей» корзины и один раз для «следующей» корзины, когда это показывает вверх.
Этот вопрос касается того, как сформировать предложение 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 и платформа?
@MarkBarinstein: это выражение предназначалось для ответа на случай, когда DateColumn
имеет тип данных числовой, а не тип данных, подобный Дата. Разве это не сработает в данном конкретном случае?
Извините, я упустил из виду тип данных DateColumn
в вашем примере.
Нижняя граница запросов даты/времени (особенно здесь) должна включать нижнюю границу, >=
, иначе вы отбросите все до полуночи.
Если у вас есть даты в виде значений 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
временную метку ваших данных.
Нижняя граница запросов даты/времени (особенно здесь) должна включать нижнюю границу, >=
, иначе вы отбросите все до полуночи.
Как насчет
SELECT * FROM "StProdMoves"
WHERE "Date(Numeric)" BETWEEN DECIMAL(DATE('2018-12-31')) * 1000000
AND DECIMAL(DATE('2019-01-07')) * 1000000 + 999999
Укажите также ожидаемый результат. stackoverflow.com/help/mcve