Отметка времени обновления DB2 SQL

Я хотел бы обновить запрос для записей между 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))

Может ли кто-нибудь сообщить мне, что я делаю неправильно?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

'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

Большое спасибо, два верхних предложения отлично сработали для меня. Единственная проблема сейчас заключается в том, что извлеченные записи также включают временные метки после 6 часов утра, так что теперь до временной метки осталось 24 часа плюс часы, оставшиеся до EOD. Не могли бы вы посоветовать?

Narimanm 20.01.2023 15:17

@Narimanm, вы можете отредактировать свой вопрос и добавить настоящий запрос?

nfgl 20.01.2023 15:31

К сожалению, я не могу добавить реальный запрос, но я хотел бы обновить запрос для записей в течение 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 20.01.2023 16:01

@Narimanm, вы должны указать, что это верхний предел, например, добавив and mytimestamp < timestamp '2023-01-20-06.00.00.000000'

nfgl 20.01.2023 16:12

За последние 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)...

Спасибо, Чарльз. Я ценю ваши предложения.

Narimanm 20.01.2023 15:25

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