您将如何处理存储在varchar字段中的日期值?

时间:2010-10-07 16:52:07

标签: .net oracle

您的用户想要按日期排序的报告。此报告是使用C#和ODP.NET创建的 您在Date列上进行排序,输出不完全符合用户的预期。

经过仔细检查,您会发现日期列是varchar2字段。 列中的值以DD-MON-YY“01-JAN-10”格式存储。

您如何按日期对其进行排序?

我的回答:

select TO_DATE(fakedatecolumn,'DD-MON-YY') from table ORDER BY TO_DATE(fakedatecolumn,'DD-MON-YY')

前端是否有可用的东西?我想DateTime.ParseExact也可以做到这一点。

2 个答案:

答案 0 :(得分:3)

你回答是对的。排序应该在数据库级别完成。使用DateTime.ParseExact意味着需要在客户端获取所有行,然后进行排序,这可能不是非常有效。从数据库中提取结果后,您可以将字符串解析为DateTime,最终在用户界面中显示格式。

答案 1 :(得分:1)

但是,如果任何值以错误的格式存储,则查询可能会崩溃,即使错误的值在逻辑上不是结果的一部分(因为Oracle可以无序地评估事物)。为了确保安全,您需要创建一个捕获转换异常的小型PL / SQL函数。

create or replace function safe_to_date(bad_data_type in varchar2) return date is
begin
  return to_date(bad_data_type, 'DD-MON-YYYY');
  --What happens if the format is wrong?  This just ignores it.
  exception when others then return null;
end;
/

然后你需要始终使用该函数而不是to_date:

select safe_TO_DATE(fakedatecolumn,'DD-MON-YY')
from table
ORDER BY safe_TO_DATE(fakedatecolumn,'DD-MON-YY');

这很糟糕,但这是你为错误存储数据而付出的代价。