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

.net 如何处理存储在varchar字段中的日期值?,.net,oracle,.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') 前端有什么可用的吗

您的用户需要按日期排序的报告。此报告是使用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
也会起作用。

你的答案是正确的。排序应该在数据库级别进行。使用
DateTime.ParseExact
意味着需要在客户端获取所有行,然后进行排序,这可能不是很有效。一旦从数据库中获取结果并进行排序,您就可以将字符串解析为
DateTime
,最终在用户界面中显示它的格式。

您的答案是正确的。排序应该在数据库级别进行。使用
DateTime.ParseExact
意味着需要在客户端获取所有行,然后进行排序,这可能不是很有效。一旦从数据库中获取结果并进行排序,您就可以将字符串解析为
日期时间
,最终在用户界面中显示其格式。

但是如果任何值以错误格式存储,您的查询可能会崩溃,即使错误的值在逻辑上不是结果的一部分(因为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;
/
然后,您需要始终使用该函数,而不是使用最新的函数:

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

这很糟糕,但这是因为数据存储不正确而付出的代价。

但是,如果任何值以错误的格式存储,即使错误的值不是结果的逻辑部分,您的查询也可能崩溃(因为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;
/
然后,您需要始终使用该函数,而不是使用最新的函数:

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

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

谢谢你的回复。我知道有开发人员在做这种事情,但我很高兴我不是他们中的一员。日期值应该总是存储在日期列中。谢谢你的回复。我知道有开发人员在做这种事情,b但我很高兴我不是其中之一。日期值应始终存储在日期列中。