我正在使用在 Oracle SQL 数据库之上运行的业务对象。我无权访问 PL 或任何类型的 SQL 命令行,也无权访问数据库。我只能将查询作为单个命令运行,需要输出一组定义的列。
我能够从用户提示中获取数据,这些数据在 SQL 中显示为:
@variable('Prompt1')
例如我可以说:
SELECT
A.SomeDate
FROM
A
WHERE
A.SomeDate BETWEEN @variable('Start') AND @variable('End Date')
这很容易。它运行;要求用户输入一些日期;然后返回它们之间的所有匹配项(包括)。
然而,问题是,用户将使用 Business Objects 的“Infoview”系统来运行查询,并且提示系统会显示一个日期选择器 - 默认情况下包括日期的时间部分(“01/01/2016 12 :00:00 AM”)。
如果用户不删除时间部分,如果 SomeDate 值超出所选时间,可能会导致记录丢失。例如,如果我想获取 TODAY 的所有记录,那么从技术上讲,我需要 00:00:00(午夜)和 23:59:59 之间的所有记录。
我真正想做的是在查询变量周围使用 TRUNC ,如下所示:
WHERE
A.SomeDate BETWEEN TRUNC(@variable('Start')) AND TRUNC(@variable('End Date'))
...但是这会导致编译错误:“不一致的数据类型:预期的 DATE 得到了 NUMBER”。我不知道为什么 Oracle 在编译之前会将提示视为数字数据类型。
有谁知道我如何获取@variable 值并将其转换为我能够截断为日期值的东西?
因此,我试图找出解决方法。我想到的一件事是我是否可以使用提示变量并将其显式转换为日期,使用 TO_DATE
编辑:有人向我指出,TRUNC 将无效,因为“12:00:00 AM”已经是午夜了。因此,我认为我误解了 TRUNC。它似乎将其截断到午夜:而我认为它只是完全删除了日期的时间部分,这意味着将在 00:00:00 和 23:59:59 之间的任何时间返回匹配项。
我真正想要的是:如果 SomeDate 有一个时间部分,例如 11:03,那么当结束日期提示仅指定日期时,我如何确保将其包含在内?