数据类型为“日期”的 Oracle sql 查询

Posted

技术标签:

【中文标题】数据类型为“日期”的 Oracle sql 查询【英文标题】:Oracle sql query with data type "date" 【发布时间】:2020-11-06 09:54:04 【问题描述】:

我遇到了数据类型为“日期”的转换列的问题。

我有桌子(我不能改变结构):

id           number(10,0)
time_stamp   date

当我使用sql查询时:

  SQL * FROM t; 

我明白了:

 id   time_stamp
    1    01.07.19
    2    20.08.19

但我需要日期和时间,所以我使用了:

SELECT  
id
,TO_TIMESTAMP(lr.time_stamp,'DD.MM.YYYY HH24:MI:SS') as dt
FROM t;

我知道了:

  id         dt
  1   01.07.19 00:00:00,000000000
  2   20.08.19 00:00:00,000000000

但是当我使用 TO_CHAR 时,我发现还有时间。

SELECT  
id
,(TO_CHAR(time_stamp, 'DD.MM.YYYY HH24:MI:SS')) as dt
FROM t

我知道了:

  id         dt
  1   01.07.19 17:09:07
  2   20.08.19 21:45:03

我只是需要时间。我尝试在 WHERE 子句中使用它来获得给定范围内的结果。但是当我这样使用它时:

SELECT id
FROM t
WHERE
 TO_TIMESTAMP(TO_CHAR(time_stamp,'DD.MM.YYYY HH24:MI:SS')) >= '01.11.2020 06:00:00' 
 AND TO_TIMESTAMP(TO_CHAR(time_stamp,'DD.MM.YYYY HH24:MI:SS')) <= '02.11.2020 06:00:00'

它没有完全优化,查询需要很长时间。你有什么建议吗? 我总是需要从昨天 06:00 到今天 06:00 的范围

【问题讨论】:

显示日期,您需要将其转换为字符串,而不是时间戳。或者,更改报告工具中的显示设置。 【参考方案1】:

您正在混合存储和表示问题。

日期以自己的内部格式存储,您无法控制。您应该使用日期函数和算术将日期作为日期进行比较。

另一方面,您可以使用字符串格式化方法to_char(),以您喜欢的格式显示它。请注意,在 date 列上应用 to_timestamp() 是没有意义的,并且可能会产生令人惊讶的结果:它旨在将字符串转换为日期,而不是相反。

假设您想要昨天早上 6 点到今天早上 6 点之间的所有记录,并且日期以显示时间部分的格式显示,那么:

select id, to_char(dt, 'dd.mm.yyyy hh24:mi:ss') dt
from t
where dt >= trunc(sysdate - 1) + 6 / 24
  and dt <  trunc(sysdate) + 6 / 24

您还可以使用间隔来表达where 条件:

where dt >= trunc(sysdate - 1) + interval '6' hour
  and dt <  trunc(sysdate) + interval '6' hour

这两个where 谓词都被称为 SARGable:没有函数应用于被过滤的列,这样效率更高,并且可以利用现有索引。

【讨论】:

它已经工作了,但持续时间是相同的,如果不比我最后的帖子更糟的话。【参考方案2】:

在 Oracle 中,Date 数据类型以内部格式存储,并包含精确到秒的日期和时间。您在从表中选择数据时看到的日期完全取决于当前会话的NLS 设置。 (NLS_DATE_FORMAT)

因此,您只需在查询中使用它,如下所示:

SELECT ID
  FROM T
 WHERE TIME_STAMP BETWEEN TO_DATE('01.11.2020 06:00:00', 'DD.MM.YYYY HH24:MI:SS') 
                      AND TO_DATE('02.11.2020 06:00:00''DD.MM.YYYY HH24:MI:SS')

【讨论】:

以上是关于数据类型为“日期”的 Oracle sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle两个日期类型字段怎么比较大小

Oracle两个日期类型字段怎么比较大小

使用 Oracle SQL Developer v19 的查询中的平均日期列

oracle中如何修改日期类型的字段值

oracle中如何修改日期类型的字段值

oracle如何按时间格式查询