【问题标题】:Time comparison between colums with datatype varchar and date数据类型为 varchar 和 date 的列之间的时间比较
【发布时间】:2018-11-02 20:25:36
【问题描述】:

在我的表格中,我有 2 列,即 RECEIVED_TIMEPROCESSES_DATE

  • RECEIVED_TIME 是一个 varchar 列,其中包含 HH24MI 格式的时间,例如1430 下午 2:30。

  • PROCESSED_DATE 是日期列,其中包含DD-MON-YYYY HH24:MI:SS 格式的完整日期,例如2018 年 5 月 23 日 16:10:00 为 5 月 18 日 23 日下午 4:10。

现在我想找出处理日期与接收时间相比超过 30 分钟的那些行。

请帮我查询。

【问题讨论】:

  • 到目前为止你有没有尝试过?
  • 作为提示,使用 TO_CHAR(SYSDATE, 'hh24mi') 获取日期字段的 hh24mi 部分。
  • Bt 如何比较这两列以找出接收后 30 分钟后处理的记录。
  • 您有收到的时间,但您不知道收到该项目的日期。因此,鉴于您拥有的数据,我看不出如何有信心回答这个问题,除非可以做出其他一些规则/假设。祝你好运。
  • 请发布create table ... 声明(DDL)。

标签: sql oracle types date-conversion


【解决方案1】:

好吧,只有当所有事情都发生在同一天时才有意义。例如:

SQL> create table test
  2    (received_time  varchar2(20),
  3     processes_date date);

Table created.

SQL> insert into test values
  2    ('1430', to_date('23.05.2018 16:10:00', 'dd.mm.yyyy hh24:mi:ss'));

1 row created.

SQL> insert into test values
  2    ('1430', to_date('23.05.2018 18:10:00', 'dd.mm.yyyy hh24:mi:ss'));

1 row created.

SQL> insert into test values
  2    ('1430', to_date('23.05.2018 14:50:00', 'dd.mm.yyyy hh24:mi:ss'));

1 row created.

SQL>

如果我们将 RECEIVED_TIME 转换为 DATE 数据类型,我们会得到:

SQL> select to_date(received_time, 'hh24mi') rectim,
  2         processes_date
  3  from test;

RECTIM           PROCESSES_DATE
---------------- ----------------
01.05.2018 14:30 23.05.2018 16:10
01.05.2018 14:30 23.05.2018 18:10
01.05.2018 14:30 23.05.2018 14:50

SQL>

啊哈; RECEIVED_TIME 被“转换”为当月的第一天。我们将对PROCESSES_DATE 执行相同的操作,将TO_DATETO_CHAR 函数与适当的格式掩码结合使用:

SQL> select to_date(received_time, 'hh24mi') rectim,
  2         to_date(to_char(processes_date, 'hh24mi'), 'hh24mi') proctim
  3  from test;

RECTIM           PROCTIM
---------------- ----------------
01.05.2018 14:30 01.05.2018 16:10
01.05.2018 14:30 01.05.2018 18:10
01.05.2018 14:30 01.05.2018 14:50

SQL>

不错;现在我们可以做一些计算,看看哪一行花了超过 30 分钟才完成;我将值四舍五入到小数点后 5 位以节省空间。另外,请注意,我正在逐步进行操作,以便您了解我们如何达到 分钟,因为两个 DATE 数据类型值的差异是 天数 em> 他们之间:

SQL> with inter as
  2    (select to_date(received_time, 'hh24mi') rectim,
  3            to_date(to_char(processes_date, 'hh24mi'), 'hh24mi') proctim
  4    from test
  5    )
  6  select
  7    proctim,
  8    rectim,
  9    round(proctim - rectim, 5) days,
 10    round((proctim - rectim) * 24, 5) hours,
 11    round((proctim - rectim) * 26 * 60, 5) minutes
 12  from inter;

PROCTIM          RECTIM                 DAYS      HOURS    MINUTES
---------------- ---------------- ---------- ---------- ----------
01.05.2018 16:10 01.05.2018 14:30     ,06944    1,66667  108,33333
01.05.2018 18:10 01.05.2018 14:30     ,15278    3,66667  238,33333
01.05.2018 14:50 01.05.2018 14:30     ,01389     ,33333   21,66667

SQL>

最后,你要找的结果:

SQL> with inter as
  2    (select to_date(received_time, 'hh24mi') rectim,
  3            to_date(to_char(processes_date, 'hh24mi'), 'hh24mi') proctim
  4    from test
  5    )
  6  select
  7    proctim,
  8    rectim,
  9    round((proctim - rectim) * 26 * 60, 5) minutes
 10  from inter
 11  where (proctim - rectim) * 26 * 60 > 30;

PROCTIM          RECTIM              MINUTES
---------------- ---------------- ----------
01.05.2018 16:10 01.05.2018 14:30  108,33333
01.05.2018 18:10 01.05.2018 14:30  238,33333

SQL>

【讨论】:

    猜你喜欢
    • 2012-01-13
    • 2018-01-07
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多