【问题标题】:Date filtering to extract from view not working从视图中提取的日期过滤不起作用
【发布时间】:2019-04-09 17:57:44
【问题描述】:

我有一个将日期格式转换为 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')

【问题讨论】:

  • 在视图中同时包含转换后的日期和原始日期,然后使用原始日期编写BETWEEN 条件
  • 为什么您希望您的视图显示日期的字符串版本 - 为什么不直接返回日期并让针对视图的查询将其格式化为字符串(如果需要)?
  • 最初的日期格式是 dd.mm.yyyy hh24.mi.ss 。

标签: sql oracle


【解决方案1】:

那是行不通的;字符串的排序与日期(或数字)不同,因此“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 这样的值,您的查询将失败。

【讨论】:

  • 我以前试过这个,它给出了同样的错误。这不是现在验证,只是输入正确的日期格式,它应该提取它
  • 我犯了一个错误,将 NULL 放入格式中,如果为空,则 Date 尝试转换 NULL,最终用户要求 NULL 替换空字段。现在我删除它,它正在工作。您的代码与我的相同,这是第一个代码,我接受它作为答案
  • 好的;我很高兴你成功了。感谢您告知我们。
【解决方案2】:

首先将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 列,只需将其添加到视图中,不要替换现有的。

【讨论】:

  • 数据库中的日期格式为 dd.mm.yyyy hh24.mi.ss 。我需要将其转换为所需的格式。
  • 日期没有格式。由您决定如何表示(或打印)日期值。仅当必须向最终用户展示时才将其转换为 CHAR,但要对 DATE 类型进行所有计算。
  • 我将它展示给最终用户,这是他们的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
相关资源
最近更新 更多