Я хотел бы обновить запрос для записей между 24 часами с определенной даты и времени. Текущий запрос работает нормально, за исключением того, что мне нужно обновить две метки времени вручную. Я хочу уменьшить число временных меток до единицы или заменить его динамическим выражением, чтобы минимизировать человеческую ошибку, если это возможно.
Текущий запрос выглядит так:
SELECT timestamp
FROM table
WHERE timestamp BETWEEN '2023-01-18-06.00.00.000000' AND '2023-01-19-06.00.00.000000'
Я пробовал несколько рекомендуемых вариантов, но это пока не работает:
WHERE timestamp > '2023-01-19-06.00.00.000000' - 24 HOURS
WHERE timestamp > '2023-01-19-06.00.00.000000' – ‘24 HOURS’
WHERE timestamp ('2023-01-19-06.00.00.000000' - 24 HOURS)
WHERE timestamp > '2023-01-19-06.00.00.000000' - '24.00.00.000000'
WHERE timestamp BETWEEN '2023-01-04-06.00.00.000000' AND INTERVAL - 24 HOURS
WHERE timestamp > CURRENT DATE - 24 HOURS
WHERE timestamp ('2023-01-19' - 1 DAY, ('06.00.00.000000' - 24 HOURS))
Может ли кто-нибудь сообщить мне, что я делаю неправильно?
'2023-01-19-06.00.00.000000' - 24 HOURS близко, но неверно, потому что DB2 видит первое значение не как метку времени, а как строку, даже если она выполняет автоматическое приведение в рабочем запросе. поэтому вам нужно указать, что это временная метка, потому что вы добавляете продолжительность
с ключевым словом timestamp
WHERE yourtimestamp > timestamp '2023-01-19-06.00.00.000000' - 24 HOURS
или функция timestamp
WHERE yourtimestamp > timestamp('2023-01-19-06.00.00.000000') - 24 HOURS
или это обозначение
WHERE yourtimestamp > '2023-01-19-06.00.00.000000'::timestamp - 24 HOURS
если вы не используете DB2LUW или старую версию, один или несколько параметров могут быть недоступны
я предлагаю вам попробовать что-то вроде этого
SELECT timestamp
FROM table cross join (values timestamp '2023-01-19-06.00.00.000000') as ref (stamp)
WHERE timestamp between ref.stamp - 24 hours and ref.stamp
@Narimanm, вы можете отредактировать свой вопрос и добавить настоящий запрос?
К сожалению, я не могу добавить реальный запрос, но я хотел бы обновить запрос для записей в течение 24 часов с определенной даты и времени, скажем, между 6:00 вчера и сегодня. Исходный запрос: SELECT timestamp FROM table WHERE timestamp МЕЖДУ «2023-01-19-06.00.00.000000» И «2023-01-20-06.00.00.000000» Новый запрос: WHERE mytimestamp > timestamp ('2023-01-20-06.00. 00.000000') - 24 ЧАСА Новый запрос не останавливается на 6 утра сегодняшнего дня, но также включает все записи за тот же день после 6 утра, что составляет более 24 часов. Есть ли способ ограничить запрос 24 часами с определенной метки времени?
@Narimanm, вы должны указать, что это верхний предел, например, добавив and mytimestamp < timestamp '2023-01-20-06.00.00.000000'
За последние 24 часа, как следует из вашего примера
WHERE timestamp > CURRENT DATE - 24 HOURS
Вы бы хотели использовать CURRENT TIMESTAMP
, а не CURRENT DATE
Для определенного периода вам всегда понадобятся две даты, указанные в предложении WHERE
, например такWHERE timestamp BETWEEN startTs AND endTs
Для определенного 24-часового периода с заданной метки времени начала вы можете сделать что-то вроде этого:WHERE timestamp BETWEEN startTs AND startTs + 24 hours
Вы можете определить startTs
как глобальную переменную и использовать ее в своем select
create variable startTs timestamp default('2023-01-18 06:00:00.000');
SELECT timestamp
FROM table
WHERE timestamp BETWEEN startTs AND startTs + 24 hours;
Или вы можете использовать конструктор значений таблицы, чтобы сохранить его для использования...
WITH tmp (startTime) AS (
VALUES (timestamp('2023-01-19 06:00:00.000'))
)
select timestamp from table
where timestamp between (select startTime from tmp limit 1)
and (select startTime + 2 hours from tmp limit 1);
В зависимости от вашего варианта использования может быть целесообразно инкапсулировать оператор как хранимую процедуру или определяемую пользователем табличную функцию (UDTF)...
Спасибо, Чарльз. Я ценю ваши предложения.
Большое спасибо, два верхних предложения отлично сработали для меня. Единственная проблема сейчас заключается в том, что извлеченные записи также включают временные метки после 6 часов утра, так что теперь до временной метки осталось 24 часа плюс часы, оставшиеся до EOD. Не могли бы вы посоветовать?