日期过滤无法从视图中提取

时间:2019-04-09 09:19:50

标签: sql oracle

我有一个将日期格式转换为DD / MM / YYYY来创建视图的代码。日期格式最初是dd.mm.yyyy hh24.mi.ss。所以我转换了它。

  NVL(TO_CHAR(D_TRANS.TRANS_DATE, 'DD/MM/YYYY'), 'NULL') AS CASE_DATE

我想使用“日期之间”过滤器从视图中获取数据,该过滤器最初可以使用,现在不再可用。出现此错误

“在期望数字的位置找到了非数字字符” *原因:使用日期格式模型转换的输入数据为            不正确输入数据不包含数字,其中数字为            格式模型要求。 *操作:修正输入数据或日期格式模型,以确保            元素在数量和类型上匹配。然后重试该操作。

     SELECT * FROM VIEW_info   
  WHERE CASE_DATE BETWEEN TO_DATE('&ENTER_START_DATE', 'DD/MM/YYYY')  
     AND TO_DATE('&ENTER_END_DATE',  'DD/MM/YYYY')

我也尝试过此操作,但只给出了从记录的记录中提取5条信息

 SELECT * FROM VIEW_info
 WHERE CASE_DATE BETWEEN TO_CHAR(TO_DATE('&ENTER_START_DATE', 
'DD/MM/YYYY'), 'DD/MM/YYYY')  AND TO_CHAR(TO_DATE('&ENTER_END_DATE',  
'DD/MM/YYYY'), 'DD/MM/YYYY')

2 个答案:

答案 0 :(得分:2)

那是行不通的;字符串与日期(或数字)的排序方式不同,因此“ 11”位于“ 2”之前。

如果CASE_DATE ,那么您最好的选择是使用日期。是吗?那你

select * from view_info
where case_date between to_date('&start_date', 'dd/mm/yyyy')
                    and to_date('&end_date'  , 'dd/mm/yyyy')

如果它是字符串(VARCHAR2列),则必须首先将其转换为日期(假设格式为dd/mm/yyyy),例如

select * from view_info
where to_date(case_date, 'dd/mm/yyyy') between to_date('&start_date', 'dd/mm/yyyy')
                                           and to_date('&end_date'  , 'dd/mm/yyyy')

由于您永远不知道用户将什么作为字符串输入,因此CASE_DATE可能很容易是'09 / 04/2019'或'dd / fx / 234v'或'$$ 75x#f9',而您不会能够TO_DATE这样的值,您的查询将失败。

答案 1 :(得分:0)

首先,您将DATE转换为CHAR

TO_CHAR(D_TRANS.TRANS_DATE, 'DD/MM/YYYY') AS CASE_DATE

然后将字符串值转换为日期:

TO_DATE('&ENTER_START_DATE', 'DD/MM/YYYY')

并比较CHARDATE数据类型。
这就是导致您出错的原因。

如果要处理日期,为什么要首先将其转换为CHAR
如果仍然需要额外的CHAR列,只需将其添加到视图中,而不要替换现有的列。