sophia kylie taylor Ответов: 2

Выберите последние 2 часовые данные в базе данных


Привет,

Я все еще новичок в том, что касается сценариев, и я взламываю этот запрос уже довольно давно. Я бы хотел получить последние 2 часа данных из большого запроса. нам удалось получить 5 - минутные записи, но я буду признателен, если вы поможете мне получить 2-часовые данные. Более того, мы хотели бы получить данные из конкретных часов. Например, данные с 8 утра до 10 вечера будут отображаться в течение 10:30 утра. Буду признателен, если вы поможете мне в этом деле.

Ниже приведен наш запрос на получение 5 минутных данных

Что я уже пробовал:

Select  A.ID, A.Timestamp,  B.Package_quantity,
safe_add(A.Package_quantity, B.Package_quantity) as defect,
from
`tbl_ER020` A
INNER JOIN `tbl_ER220` B
ON A.ID = B.ID
where datetime_add('1900-01-01 00:00:00', interval 27900 + safe_cast(60 * 5 * floor(datetime_diff(current_datetime(),'1900-01-01 00:00:00',minute)/5) as int64) - 450 second) <= datetime(A.Timestamp)
            And DateTime(A.Timestamp) < datetime_add('1900-01-01 00:00:00', interval 27900 + safe_cast(60 * 5 * floor(datetime_diff(current_datetime(),'1900-01-01 00:00:00',minute)/5) as int64) - 150 second)
            ORDER BY A.Timestamp ASC

Maciej Los

Какой поставщик баз данных? Похоже на MySql или Postgres.

2 Ответов

Рейтинг:
2

MarcusCole6833

Мое решение-это небольшое уточнение к вышесказанному

declare @d1 datetime = dateadd(hh,-2, getdate()) 
declare @d2 datetime = getdate()
Select  A.ID, A.Timestamp,  B.Package_quantity,
safe_add(A.Package_quantity, B.Package_quantity) as defect,
from
`tbl_ER020` A
INNER JOIN `tbl_ER220` B
ON A.ID = B.ID
where a. timestamp between @d1 and @d2
            
            ORDER BY A.Timestamp ASC


Дата добавления покрыта ею

DATEADD (Transact-SQL) - SQL Server | Microsoft Docs[^]


Между тем здесь

МЕЖДУ (Transact-SQL) - SQL Server | Microsoft Docs[^]


Рейтинг:
0

Patrice T

Даже если я не практикую SQL, у меня достаточно опыта, чтобы увидеть очень плохой дизайн, чего следует избегать любой ценой.
- Потому что ты пользуешься current_datetime() 2 раза вы можете быть несчастливы и иметь их в другую минуту, час или День, которые молча сделают запрос на другой промежуток времени, чем ожидалось.
- Если компилятор SQL не может понять, что вы хотите, чтобы 2 границы были постоянными (что не указано) в запросе, он выдаст 2 current_datetime() за запись, потому что current_datetime() это изменчиво. И не очень хорошо.
- Если компилятор SQL не может удалить DateTime() от DateTime(A.Timestamp), сервер не сможет использовать индекс.

Правильный способ сделать это таков:

-- declare the 2 variables with same datatype as A.Timestamp
declare @start datetime;
declare @End datetime;
declare @DT datetime = current_datetime(); -- read current_datetime() once
-- set start and End values
set @Start = @DT - ... ; -- cancel seconds, minutes and hours as needed
set @End = @Start + ... ; -- add offset as needed

Select  A.ID, A.Timestamp,  B.Package_quantity,
safe_add(A.Package_quantity, B.Package_quantity) as defect,
from
`tbl_ER020` A
INNER JOIN `tbl_ER220` B
ON A.ID = B.ID
where @Start <= A.Timestamp And A.Timestamp < @End
ORDER BY A.Timestamp ASC;

Зачем делать запрос таким образом?
Время выполнения запроса зависит от количества записей datatable.
Время выполнения моего запроса зависит от количества записей выбранного результата.
На огромной базе данных это имеет большое значение.
[Обновление]
Читать там: PostgreSQL: Документация: 9.1: Категории Волатильности Функций[^]
Цитата:
Изменчивая функция может делать все, что угодно, включая изменение базы данных. Он может возвращать различные результаты при последовательных вызовах с одними и теми же аргументами. Оптимизатор не делает никаких предположений о поведении таких функций. Запрос, использующий изменчивую функцию, будет повторно оценивать функцию в каждой строке, где требуется ее значение.


ZurdoDev

"2 current_datetime() на запись" - я не думаю, что эта часть правильна. Sql обрабатывает операторы как набор и поэтому все записи в наборе будут получать одно и то же время даже при использовании current_datetime()

ZurdoDev

Это для postgre sql. Я имел в виду Ms Sql. Я не мог сказать от ОП, какая это была версия. И я все еще не уверен, что это означает то, что ты думаешь. Хотя, может быть.

Например,
Выберите t.*, current_datetime()
От anytable t

Меняется ли последняя колонка? Или все записи в результирующем наборе имеют одинаковую отметку времени?

Patrice T

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