【问题标题】:JPA/SQL to get one week dataJPA/SQL 获取一周数据
【发布时间】:2020-10-08 07:38:35
【问题描述】:

我正在尝试获取一周的数据,并将其与我拥有的到期列进行比较。所以我需要写一个查询,如果到期时间在星期一的当前日期 + 7 天之间,然后获取这些记录。我目前正在使用 JPA 连接到 Oracle DB。由于 JPA 还允许编写 SQL 查询,因此请尝试其中任何一种。

第一次尝试

     select * from table  WHERE due_date >= CAST (DATEADD(day,7, GETDATE())AS Date);

执行此查询后显示 DATEADD 无效

由于到期日期列存储为 Varchar2,因此我需要先转换表之间的时间戳

       to_date("yyyy-MM-dd") and then do the comparison. 

我也试过

      due_date >= TO_DATE(CURDATE(),INTERVAL 7 DAY); and says invalid.

提前致谢

【问题讨论】:

    标签: sql oracle jpa


    【解决方案1】:

    DATEADDGETDATE 不是 Oracle 函数。相反,将INTERVAL 添加到SYSDATE 以获得与当前查询等效的内容:

    SELECT *
    FROM   table_name 
    WHERE  due_date >= SYSDATE + INTERVAL '7' DAY;
    

    如果您希望它从 7 天时间的午夜开始(而不是当前时间),那么也可以使用 TRUNC

    SELECT *
    FROM   table_name 
    WHERE  due_date >= TRUNC(SYSDATE) + INTERVAL '7' DAY;
    

    所以我需要编写一个查询,说明到期日期是否在星期一的当前日期 + 7 天之间

    如果您想要查询due_date 介于当前日期和下周星期一之间,那么:

    SELECT *
    FROM   table_name 
    WHERE  due_date >= TRUNC( SYSDATE )
    AND    due_date <  TRUNC( SYSDATE, 'IW' ) + INTERVAL '7' DAY;
    

    由于due_date 列存储为 Varchar2

    请不要那样做。如果您要获取日期值,请将其存储为 DATE 数据类型。

    但是,由于您将其存储为 ISO8601 格式的字符串,您可以将比较的右侧转换为字符串并将值作为字符串进行比较(但最好使用日期)。

    SELECT *
    FROM   table_name 
    WHERE  due_date >= TO_CHAR( SYSDATE, 'YYYY-MM-DD' )
    AND    due_date <  TO_CHAR(
                         TRUNC( SYSDATE, 'IW' ) + INTERVAL '7' DAY,
                         'YYYY-MM-DD'
                       );
    

    如果您要使用TO_DATEdue_date 从字符串转换为日期,那么查询也可以工作;但是,Oracle 将无法在 due_date 列上使用索引,并且要能够使用索引,您需要在 TO_DATE( due_date, 'YYYY-MM-DD' ) 上使用基于函数的索引,因此最好转换右侧(但仍然更少比将列作为 DATE 数据类型并且不需要转换更可取)。

    【讨论】:

    • 我应该做这样的事情 SELECT * FROM TABLE 1 WHERE TO_DATE( due_date, 'YYYY-MM-DD' ) > = TO_DATE( SYSDATE, 'YYYY-MM-DD' ) AND TO_DATE( due_date , 'YYYY-MM-DD' )
    • SELECT * FROM TABLE 1 WHERE to_date(due_date,'YYYY-MM-DD') >= TO_CHAR(SYSDATE, 'YYYY-MM-DD') AND to_date(due_date,'YYYY-MM- DD')
    • 日期比较比字符串好
    • 在您的第一个查询中,您不想在已经是 DATE 数据类型的值上使用 TO_DATE(例如 SYSDATE);如果您修复它,那么它会起作用,但是正如我在回答中所说,在列值上使用 TO_DATE 会阻止您在该列上使用索引(并且您需要一个单独的基于函数的索引)。第二个查询是错误的,因为您在同一比较中混合了 TO_DATETO_CHAR
    • 最好将您的表格更改为不将日期存储为VARCHAR2,而是将它们存储为DATE 数据类型。您没有这样做,因此您要么需要解决该问题,要么选择第二好的选择,即使用字符串比较(这将在您使用 ISO8601 格式的日期时起作用)或将所有内容转换为日期(但你可以' t 使用索引)。
    猜你喜欢
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 2014-12-02
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多