Я использую Business Objects, который работает поверх базы данных Oracle SQL. У меня нет доступа к PL или любой командной строке SQL, и у меня нет доступа на запись в базу данных. Я могу запускать запросы только в виде одиночных команд, требуя вывода определенного набора столбцов.Передача пользовательского приглашения в виде даты (или даже строки) в Oracle SQL
Я могу принимать данные от пользователя подсказок, которые появляются в SQL, как:
@variable('Prompt1')
Например, я могу сказать:
SELECT
A.SomeDate
FROM
A
WHERE
A.SomeDate BETWEEN @variable('Start') AND @variable('End Date')
Это достаточно просто. Он работает; запрашивает у пользователя ввод некоторых дат; и затем возвращает все совпадения, которые находятся между ними (включительно).
Проблема заключается в том, что пользователи будут использовать систему «Infoview» Business Objects для запуска запросов, а система приглашений представляет собой сборщик дат, который по умолчанию включает временную часть даты («01/01/2016 12:00:00 AM ").
Если пользователь не удаляет временную часть, это может привести к пропущению записи записей, если значение SomeDate выходит за пределы выбранного времени. Например, если я хочу взять все записи СЕГОДНЯ, то я технически хочу все между 00:00:00 (полночь) и 23:59:59.
То, что я действительно хотел бы быть в состоянии сделать, это использовать TRUNC вокруг переменной запроса следующим образом:
WHERE
A.SomeDate BETWEEN TRUNC(@variable('Start')) AND TRUNC(@variable('End Date'))
... Однако это вызывает ошибку компиляции: «несогласованные типы данных: ожидается DATE получил НОМЕР ». Я не знаю, почему Oracle будет обрабатывать приглашение как числовой тип данных до его компиляции.
Кто-нибудь знает, как я могу принять значение @variable и преобразовать его во что-то, что я смогу усечь до значения даты?
Поэтому я пытаюсь найти способ обойти это. Единственное, что я имел в виду, это то, что если бы я мог взять переменную приглашения и преобразовать ее явно в дату, используя TO_DATE
Редактировать: мне было указано, что TRUNC не будет иметь никакого эффекта, поскольку «12: 00:00 утра "уже полночь. Поэтому я думаю, что неправильно понял TRUNC. Похоже, что он усекает его до полуночи: в то время как я думал, что он просто удаляет временную часть даты вообще, что означает, что совпадения будут возвращены в любое время между 00:00:00 и 23:59:59.
Что я действительно хочу: если SomeDate имеет временную часть, например, 11:03, то как я могу убедиться, что это будет включено, когда приглашение в конце даты указывает только день?
Если сборщик данных всегда проходит время как 12:00:00, тогда усечение его не будет иметь эффекта; уже в полночь. –
@Alex Poole - хм, интересно знать. Что происходит, когда значение SomeDate имеет временную часть, например 11:02 и т. Д. Я упростил свой пример выше, но я действительно хочу посмотреть между датами. Например, если я хочу перечислить все события, происходящие СЕГОДНЯ, в том числе в 11:02, тогда поиск «полночь» не подберет их. Я думал, что усечение будет означать, что никакая часть времени не была обыскана. –
Даты Oracle всегда имеют время, вы не можете удалить его - установите только до полуночи, что по умолчанию делает trunc. Итак, вы хотите совместить записи между 00:00:00 по дате начала и 23; 59: 59 на дату окончания? –