【问题标题】:Get records between specific time-frame获取特定时间范围之间的记录
【发布时间】:2019-03-05 14:37:55
【问题描述】:

我正在尝试挑选时间范围内的所有可用记录。

我需要从 TABLE2 中获取时间戳,并让 TABLE1 中的所有记录在该时间和当前时间之间都可用。

SELECT COUNT(*) 
FROM TABLE1 
WHERE STATUS = 'COMPLETED' 
      AND LAST_UPDATE_USER = 'myID' 
      AND LAST_UPDATE_DT BETWEEN 
          TO_DATE((
              SELECT /*+PARALLEL(16)*/ SIGN_IN_DT 
              FROM TABLE2 
              WHERE ID = 'myID' 
                    AND SIGNED_SCREEN = 'screen1' 
                    AND SIGN_OFF_DT IS NULL), 
              'dd-mon-yyyy hh24:mi:ss.ff') 
           AND SYSDATE;

两个表格中的日期格式 = 05-MAR-19 07.47.26.769934000 PM

我得到了例外:

ORA-01821:日期格式无法识别

请帮忙。

【问题讨论】:

  • 两列的数据类型是什么?
  • 时间戳数据类型。
  • 为什么要对已经是DATE(或TIMESTAMP)的值执行TO_DATE(...)?跳过TO_DATE(...
  • 不要尝试将 DATE(或 TIMESTAMP)数据类型中已有的内容转换为 DATE(或 TIMESTAMP。您有两个 TIMESTAMP 列,因此只需按原样进行比较!
  • 您的子查询必须只返回 1 行。在这种情况下,/*+PARALLEL(16)*/ 似乎没什么用。

标签: oracle


【解决方案1】:

试试这个查询:

select * from table1 t1
      join table2 t2 on t1.last_update_user = t2.ID
where t1.status = 'COMPLETED'
  and t1.last_update_user = 'myID'
  and t2.signed_screen = 'screen1'
  and t2.sign_off_dt is null
  and t1.last_update_dt between t2.sign_in_dt and sysdate;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    相关资源
    最近更新 更多