Chr*_*lle 6 sql oracle truncate business-objects infoview
我正在使用Business Objects,它运行在Oracle SQL数据库之上.我没有访问PL或任何类型的SQL命令行,我没有对数据库的写访问权限.我只能将查询作为单个命令运行,需要输出一组已定义的列.
我可以从用户提示中获取数据,这些提示出现在SQL中:
@variable('Prompt1')
Run Code Online (Sandbox Code Playgroud)
例如我可以说:
SELECT
A.SomeDate
FROM
A
WHERE
A.SomeDate BETWEEN @variable('Start') AND @variable('End Date')
Run Code Online (Sandbox Code Playgroud)
这很容易.它运行; 请求用户输入一些日期; 然后返回它们之间的所有匹配(包括).
但问题是,用户将使用Business Objects的"Infoview"系统来运行查询,并且提示系统会显示日期选择器 - 默认情况下包括日期的时间部分("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'))
Run Code Online (Sandbox Code Playgroud)
...但是这会导致编译错误:"数据类型不一致:预期DATE得到NUMBER".我不知道为什么Oracle会在编译之前将提示视为数字数据类型.
有谁知道如何获取@variable值并将其转换为我能够截断为日期值的东西?
因此,我正试图找到解决这个问题的方法.我想到的一件事是,如果我可以使用提示变量并使用TO_DATE将其显式转换为日期
编辑:有人向我指出,TRUNC将无效,因为"12:00:00 AM"已经是午夜.所以我觉得我误解了TRUNC.似乎它将它截断到午夜:而我认为它只是完全删除了日期的时间部分,这意味着匹配将在00:00:00和23:59:59之间的任何时间返回.
我真正想要的是:如果SomeDate有一个时间部分,例如,11:03那么当结束日期提示只指定当天时,我如何确保包括它?
如果您想要匹配SomeDate开始时 00:00:00 和结束时 23:59:59 之间的值,您可以调整结束日期以使用该时间而不是默认午夜,或使用范围而不是between:
WHERE
A.SomeDate >= @variable('Start')
AND
A.SomeDate < @variable('End Date') + 1
Run Code Online (Sandbox Code Playgroud)
使用Oracle 日期算术为您提供变量值之后的日期,因此如果用户选择“01/01/2016 12:00:00 AM”作为开始日期和结束日期,他们将评估为 2016-01-01 + 100分别为 :00:00 和 2016-01-02 00:00:00。如果您愿意,可以使用该语法。interval
通过使用小于作为上限,您可以获得SomeDate大于或等于开始日期 2016-01-01 00:00:00 且小于调整后的结束日期 2016-01-02 00:00:00的所有记录- 这与截至 2016-01-01 23:59:59 的说法相同。(或者,如果您有一个具有亚秒精度的时间戳列,最高可达 23:59:59.999...)。
如果解析器假设变量将是一个字符串,但它实际上是一个日期 - 导致“数据类型不一致”错误 - 那么您可以将其转换为日期以满足解析器:
WHERE
A.SomeDate >= CAST(@variable('Start') AS DATE)
AND
A.SomeDate < CAST(@variable('End Date') AS DATE) + 1
Run Code Online (Sandbox Code Playgroud)
或者,如果它实际上以您显示的格式作为字符串传递,您可以显式转换它:
WHERE
A.SomeDate >= TO_DATE(@variable('Start'), 'DD/MM/YYYY HH:MI:SS AM')
AND
A.SomeDate < TO_DATE(@variable('End Date'), 'DD/MM/YYYY HH:MI:SS AM') + 1
Run Code Online (Sandbox Code Playgroud)
...确保格式正确;从您的示例来看,它可能是 DD/MM/YYYY 或 MM/DD/YYYY。
| 归档时间: |
|
| 查看次数: |
2051 次 |
| 最近记录: |