Oracle,查找两个不同日期之间的数据

时间:2018-06-28 11:38:47

标签: sql oracle

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

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

手段,2018年6月12日。

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

2 个答案:

答案 0 :(得分:1)

假设您的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。如果您传递一个2位数的值(例如18),并尝试使用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);

答案 1 :(得分:0)

我假设在表 business_details 中,您有一列日期或类似的内容。

比使用像这样的东西:

select business_date from business_details
where date between TO_DATE ('12-JUN-18 21:15:13','dd-MM-yy hh:mi:ss') 
               AND TO_DATE ('25-JUN-18 18:15:32','dd-MM-yy hh:mi:ss');