我有一个表名称为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
答案 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');