您的用户想要按日期排序的报告。此报告是使用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
也可以做到这一点。
答案 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');
这很糟糕,但这是你为错误存储数据而付出的代价。