加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在Oracle SQL中将用户提示作为日期(甚至是字符串)传递

发布时间:2020-12-12 16:29:49 所属栏目:百科 来源:网络整理
导读:我正在使用Business Objects,它运行在Oracle SQL数据库之上.我没有访问PL或任何类型的SQL命令行,我没有对数据库的写访问权限.我只能将查询作为单个命令运行,需要输出一组已定义的列. 我可以从用户提示中获取数据,这些提示出现在SQL中: @variable('Prompt1')
我正在使用Business Objects,它运行在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值超出所选时间,则可能导致错过记录.例如,如果我想获取今天的所有记录,那么我在技术上想要在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那么当结束日期提示只指定当天时,我如何确保包括它?

如果要在开始时的00:00:00和结束时的23:59:59之间匹配SomeDate值,您可以将结束日期调整为具有该时间而不是默认的午夜,或者使用范围而不是:
WHERE
    A.SomeDate >= @variable('Start')
AND
    A.SomeDate < @variable('End Date') + 1

1使用Oracle date arithmetic为您提供变量值后的第二天,因此如果用户选择“01/01/2016 12:00:00 AM”作为开始日期和结束日期,他们将评估为2016-01-01 00:分别于00:00和2016-01-02 00:00:00.如果您愿意,可以使用区间语法.

通过使用小于上限,您将获得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

或者如果它实际上以您显示的格式作为字符串传递,您可以显式转换它:

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

……确保你有正确的格式;从你的例子可以是DD / MM / YYYY或MM / DD / YYYY.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读