Вход

Просмотр полной версии : SQL-запрос



Enigma
09.10.2024, 06:49
День добрый. Подскажите, как можно реализовать изменение дат выборки в запросе по протоколу MSSQL, чтобы получать значения за разные даты. Данные нужны именно в виде массива. Пробовал реализовать помощью функций работы со строками ни чего не вышло.
Есть структура из 11 элементов ну и сам запрос.

SELECT TOP (1000)
,[DateTime]
,[T1]
,[P1]
,[M1]
,[T2]
,[P2]
,[M2]
,[MTV]
,[WTV]
,[W1]
,[W2]
FROM [VKTBase].[dbo].[20_1_1_2] where DateTime between '2024-01-02 00:00:00' and '2024-02-02 00:00:00'

pavel.migdalev
09.10.2024, 08:50
Может так:
where DateTime >= '2024-01-02 00:00:00' AND DateTime < '2024-02-02 00:00:00' OR DateTime >= '2024-02-02 00:00:00' AND DateTime < '2024-03-02 00:00:00' OR DateTime >= '2024-03-02 00:00:00' AND DateTime < '2024-04-02 00:00:00' и т.д.

Enigma
09.10.2024, 08:56
Я думаю, может есть способ через замену дат переменными.

МихаилГл
09.10.2024, 09:54
Я думаю, может есть способ через замену дат переменными.

Тогда надо впереди запроса declare делать и пр. Как в обычном sql...

Enigma
09.10.2024, 11:40
Тогда надо впереди запроса declare делать и пр. Как в обычном sql...

А как можно связать переменную объявленную в SQL-запросе с параметром в MS4D?

Я попытался реализовать это так, но запрос не выполняется и ошибка не пишется.
79254

МихаилГл
09.10.2024, 11:49
Не знаю. Может надо ещё форматировать переменную к виду в базе. Я с MS4D мало работал, почти не работал. Но вроде запросы там можно как в sql оформлять со всеми параметрами tsql. Я вот о чем.

imaex
09.10.2024, 11:56
Тогда надо впереди запроса declare делать и пр. Как в обычном sql...

:D В SQL нет никаких "declare". И быть не может, поскольку это не процедурный язык.

МихаилГл
09.10.2024, 12:50
:D В SQL нет никаких "declare". И быть не может, поскольку это не процедурный язык.

Ничего не понял...
IF EXISTS (SELECT TOP (1) * FROM [RSnew].[dbo].[DBData] WHERE ([StatusStop] = 0))
BEGIN
UPDATE [RSnew].[dbo].[DBData]
SET [DateTimeStart] = GETDATE(), [DateTimeStop] = GETDATE(), [StatusStart] = 1
WHERE [StatusStop] = 0
END
ELSE IF NOT EXISTS (SELECT TOP (1) * FROM [RSnew].[dbo].[DBData] WHERE ([StatusStart] = 1) and ([StatusStop] = 0))
BEGIN
declare
@String1 varchar(30),
@String2 varchar(30),
@String3 varchar(30),
@String4 varchar(30)
select
@String1 = [String1],
@String2 = [String2],
@String3 = [String3],
@String4 = [String4]
from
[RSnew].[dbo].[DBInfo]
INSERT INTO [RSnew].[dbo].[DBData] ([DateTimeStart], [DateTimeStop], [StatusStart], [StatusStop], [String1], [String2], [String3], [String4])
VALUES (GETDATE(), GETDATE(), 1, 0, @String1, @String2, @String3, @String4)
END


Я конечно не спец, но вот пример sql запросов которые я использую.
И как я помню я похожее вводил в MS4D и все работало пол года назад... Только для переменных там свои особенности были.

PS Вот из документации:
Синтаксис запросов для работы с базами данных
Есть два способа вставки данных в запрос:
•текст запроса {ИмяКанала} текст запроса..
•текст запроса {$ИмяКанала} текст запроса..
{CH} Данные и запрос передаются раздельно и "объединение" происходит на сервере БД.
Плюсы:

•Защита от SQL-"инъекций"

•Выполнение запроса происходит немного быстрее

Минусы:

•Не во все части sql запроса можно вставить. Например, сервер БД не позволит выполнить такой запрос: select {CH1} from {CH2}

{$CH} Данные из каналов напрямую вставляются в тело запроса в момент отправки на сервер.
Плюсы:

•Можно динамизировать запросы, т.е. писать запросы вида: select {$CH1} from {$CH2} where {$CH3} = {CH4}

Минусы:

•Подстановка происходит как есть, без экранирования спецсиволов. Если в CH1 будет текст вида 1; DROP TABLE test; select 1он отправится на сервер и успешно там выполнится
Может про это?

imaex
09.10.2024, 13:41
вот пример sql запросов которые я использую.


Это не SQL, а одно из его проприетарных процедурных расширений, Transact-SQL, как я понимаю, в данном случае. Чтобы его использовать на уровне стороннего софта, нужно, чтобы этот самый сторонний софт имел собственный движок (engine) T-SQL, если я правильно понимаю. Что, как я подозреваю, бывает не очень часто. Есть ли возможность прибиндить переменные MS4D в запрос и как это сделать - я не знаю, тут техподдержка бывает обитает для таких вопросов. Но к T-SQL это никакого отношения не имеет.

Сам SQL - непроцедурный язык.

Enigma
09.10.2024, 14:33
Спасибо. Вроде заработало.
Запрос:
SELECT TOP (100)[DateTime],[T1],[P1],[M1],[T2],[P2],[M2],[MTV],[WTV],[W1],[W2]
FROM [VKTBase].[dbo].[20_1_1_2] WHERE DateTime BETWEEN {Begin} and {End}
79269

МихаилГл
09.10.2024, 15:04
Сам SQL - непроцедурный язык.

Ну не процедурный, а декларативный, хотя я не в теме ни там ни там)

Я вообще АСУТП шник и это когда то было изучено самостоятельно по рабочей базе данных. Что можно в t-sql писать, то и советую. Эти запросы отлично во многих программах работают, пока ещё ни одной не поддерживающей такой формат не встречался.

Enigma
14.10.2024, 14:09
Появился еще вопрос. При выполнении подобных "динамизированных" запросов у меня остаются "паразитные" элементы в массиве от предыдущего запроса. Появляются в случае если элементов в ответе было меньше чем в предыдущем.
Первый запрос:79382
Второй запрос:79383
Третий запрос:79384
Пробывал подключать/выполнять по условию безрезультатно.

МихаилГл
14.10.2024, 16:05
Появился еще вопрос. При выполнении подобных "динамизированных" запросов у меня остаются "паразитные" элементы в массиве от предыдущего запроса. Появляются в случае если элементов в ответе было меньше чем в предыдущем.
Первый запрос:79382
Второй запрос:79383
Третий запрос:79384
Пробывал подключать/выполнять по условию безрезультатно.

Я бы пока не нашёл бы правильного решения сделал бы костыль... Заполнил бы всё сначала null, а потом рабочий запрос послал. А так даже не знаю как это решить. Должна где-то быть очистка перед записью. Может в st коде очищать перед запросом.

melky
14.10.2024, 16:40
Как ответы от предыдущего запроса могут быть новее по дате времени от текущего? вот в чем вопрос... 3-й скрин

МихаилГл
14.10.2024, 17:22
Как ответы от предыдущего запроса могут быть новее по дате времени от текущего? вот в чем вопрос... 3-й скрин

Ну скорее всего дата запроса старее, вернее запрос на старые данные. А таблица не очищена перед запросм. В mssql это как бы новый запрос и новый ответ, а тут он походу пишет в старый уже заполненный массив. Надо как то очистить.

Enigma
15.10.2024, 06:16
Даты старые. Таблицы разные.
Даты можно и поменять, но от этого ни чего не изменится. Всё зависит от количестве элементов в ответе на запрос, если их меньше чем в предыдущем ответе. Часть из них остаётся в новом ответе.

Enigma
23.10.2024, 13:47
Ответ от InSAT

Был такой баг. Сейчас восстановить версию с которой он был устранен нет возможности.
Рекомендация обновиться до актуальной версии!
От себя добавлю, что обычно исправляют с выходом нового релиза.