【问题标题】:BIRT Report: Parameters between two datesBIRT 报告:两个日期之间的参数
【发布时间】:2014-02-07 14:47:11
【问题描述】:

我在 BIRT 中针对 Oracle 数据库编写了一份报告:

表:

tranx_no (string)
type (string)
description (string)
amount (number(14,2))
date (date)

BIRT 中的查询:

SELECT tranx_no, type, description, amount
FROM tranx_table
WHERE date BETWEEN ? AND ?

如果我只是在参数中使用简单的日期(02-01-2014 和 02-14-2014),它会错过 14 日当天发生的事情(在午夜停止)。我已经尝试将时间连接到日期参数上

WHERE date BETWEEN ? || '12:00:00 AM' AND ? || '11:59:59 PM'

并得到一个 ORA 01843 错误。我也尝试使用to_date

WHERE date BETWEEN TO_DATE(? || '12:00:00 AM', 'MM-DD-YYYY HH:MI:SS AM') AND TO_DATE(? || '11:59:59 PM', 'MM-DD-YYYY HH:MI:SS AM')

那里也没有欢乐。那个会发生 ORA 01847 错误。

想法?我知道我可能没有想到一些简单的事情,但谷歌并没有提供帮助。我想编辑查询,而不是更改表单正面的日期条目。

谢谢。

【问题讨论】:

    标签: oracle birt


    【解决方案1】:

    使用 BIRT 正确处理 DATE 可能很棘手。

    我建议始终使用 VARCHAR2 来传递 DATE 参数(用于报告参数以及查询参数)。始终验证参数的数据类型。

    在您的 SQL 中,始终使用带有 显式日期格式的 TO_DATE / TO_CHAR - 否则结果将取决于区域设置。

    接下来,确保用户输入的值在用于查询之前已调整为已知的日期格式。例如,在德国,通常使用 SQL 日期格式 DD.MM.YYYY HH24:MI:SS。

    您可以创建一个实用函数来自动添加缺失的部分(例如时间)。在此函数中使用附加参数来指定它是“开始”日期(添加 00:00:00)还是“结束”日期(添加 23:59:59)。

    OTOH,如果 UI 强制用户输入起始日期没有时间(如您的示例中的格式“MM-DD-YYYY”),您可以编写代码 p>

    WHERE (date >= to_date(?, 'MM-DD-YYYY') and date < to_date(?, 'MM-DD-YYYY') + 1)
    

    注意

    这是有效的,因为如果格式掩码中没有指定时间,则隐含 00:00:00(HH24:MI:SS 格式)。

    【讨论】:

    • 很抱歉直到现在才给你打勾,但这是有效的!
    【解决方案2】:

    正如您所指出的,开始日期不是问题,因为它从开始日期的 00:00:00 开始。如果您的参数是文本框,您的用户可以输入 02-01-2014 08:00:00 以获取从 2 月 1 日上午 8 点开始的结果。

    请注意,我的日期格式是年份在前,而您的日期格式是最后一年

    对于结束日期,我使用一个文本框参数作为我的默认值

    //Creates a date for one second before midnight of the current date,
    //which is properly formatted to use as an end date in quires (for my data)
    // Note that a custom date format (yyyy-MM-dd HH:mm:ss) is required for proper display in pop-up GUI
    
    var T; T = BirtDateTime.addDay(BirtDateTime.today(),1);
    var Y; Y = BirtDateTime.year(T);
    var M; M = BirtDateTime.month(T);
    var D; D = BirtDateTime.day(T);
    
    {
    Y +"-"
    + M +"-"
    + D +" "
    +"00:00:00"
    }
    

    我也使用这个帮助文本

    Enter date as YYYY-MM-DD. For example, 2013-3-14
    

    添加此提示文字

    End Date (YYYY-MM-DD), if time is blank will default to 00:00:00
    

    【讨论】:

    • 这对我的问题没有帮助,因为我需要在输入后添加额外的一天,因为它可以运行任意数量的日期。让我的用户在结尾添加一天对他们来说很难记住。
    • @danielw-msu 如果您不担心日期的最后一秒,请将 JS 的最后一行更改为 23:59:59,因为这是默认值,当他们更改日期时只要他们不修改时间,一切都会好起来的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多