首页 > 解决方案 > Oracle,查找两个不同日期之间的数据

问题描述

我有一个表名为business_details,列名为business_date,其数据类型为varchar2。

现在我必须找出两个不同日期和日期格式之间的数据,例如:12-JUN-18 21:15:13

意味着,2018 年 6 月 12 日。

请帮我写一个查询,它可以获取这两个日期之间的数据:12-JUN-18 21:15:13 和 25-JUN-18 18:15:32

标签: sqloracle

解决方案


假设您business_date实际上是您显示的格式的字符串(并且它不是您的客户端仅以该格式显示的日期),您需要将其转换为日期类型,以及转换字符串文字。

select *
from business_details
where to_date(business_date, 'DD-MON-RR HH24:MI:SS')
  between to_date('12-JUN-18 21:15:13', 'DD-MON-RR HH24:MI:SS')
      and to_date('25-JUN-18 18:15:32', 'DD-MON-RR HH24:MI:SS');

您尝试在评论中使用的格式模型是这样的:

to_date('12-JUN-18 21:15:13', 'DD-MM-YYYY HH24:MI:SS')

正在使用MM而不是MON,默认情况下无论如何都可以使用 - 尽管使用月份数字更安全,因为它们不依赖于您的会话语言。但更重要的是它使用YYYY. 如果您传递一个像 18 这样的 2 位值并尝试与YYYY您进行转换,则会得到错误的年份:

select to_date('12-JUN-18 21:15:13', 'DD-MON-YYYY HH24:MI:SS') form dual;

TO_DATE('12-JUN-182
-------------------
0018-06-12 21:15:13

在您的版本中,您business_date正在被隐式转换,因此将使用 NLS 设置,这些设置可能RR已经在使用。但这意味着您将 2018 年的日期与 0018 年的范围进行比较,这就是为什么没有匹配的原因。


您还可以对固定值使用时间戳文字(除非这些字符串实际上是从其他地方传入的):

select *
from business_details
where to_date(business_date, 'DD-MON-RR HH24:MI:SS')
  between cast(timestamp '2018-06-12 21:15:13' as date)
      and cast(timestamp '2018-06-25 18:15:32' as date);

推荐阅读