Oracle - 使用 to_date() 从日期时间获取日期

Oracle - Get date from date time using to_date()

我从 XML 文件中得到一个 XML date/time 并且需要将它加载到数据类型仅为 Date 中,所以我必须截断时间。

为了让 Oracle 进行截断,我想尝试这样的操作:

TO_DATE('2015-11-04 13:45:19.387-05:00','YYYY-MM-DD') 

我通过 运行 验证失败:

SELECT TO_DATE('2015-11-04 13:45:19.387-05:00','YYYY-MM-DD') FROM DUAL 

它抛出错误:ORA-01830:数据格式图片在转换整个字符串之前结束。

我试图尽量减少对构建 SQL 语句的 C# 程序的更改。如果需要,我可以更改我的 C# 代码以生成此代码:

TO_DATE('2015-11-04','YYYY-MM-DD') 

Oracle 可以处理截断还是我必须在我的程序中处理?

如果您将信息存储在 Oracle 的 DATE 列中(它接受日期和时间),那么以下内容应该可以帮助您了解您需要做什么:

select to_timestamp_tz('2015-11-04 13:45:19.387-05:00','YYYY-MM-DD hh24:mi:ss.ff3tzh:tzm') tz, 
       to_date(to_char(to_timestamp_tz('2015-11-04 13:45:19.387-05:00','YYYY-MM-DD hh24:mi:ss.ff3tzh:tzm'), 'dd/mm/yyyy hh24:mi:ss'), 'dd/mm/yyyy hh24:mi:ss') tz_char_date,
       cast(to_timestamp_tz('2015-11-04 13:45:19.387-05:00','YYYY-MM-DD hh24:mi:ss.ff3tzh:tzm') as date) tz_cast_date
from   dual;

TZ                                       TZ_CHAR_DATE             TZ_CAST_DATE              
---------------------------------------- ------------------- ---------------------
04/11/2015 13:45:19.387000000 -05:00     04/11/2015 13:45:19 2015-11-04 13:45:19  

另一种方法是使用 substr 来缩短字符串以获得您感兴趣的部分:

select to_date(substr('2015-11-04 13:45:19.387-05:00', 1, 19), 'yyyy-mm-dd hh24:mi:ss') substr_date
from   dual;

SUBSTR_DATE          
---------------------
2015-11-04 13:45:19  

您可以使用 the to_timestamp_tz() function 将字符串从 XML 转换为具有时区值的时间戳:

SELECT TO_TIMESTAMP_TZ('2015-11-04 13:45:19.387-05:00','YYYY-MM-DD HH24:MI:SS.FFTZH:TZM')
FROM DUAL;

TO_TIMESTAMP_TZ('2015-11-0413:45:19.387-05:00','YYYY-MM-DDHH24:MI:SS.FFTZH:TZM')
--------------------------------------------------------------------------------
04-NOV-15 13.45.19.387000000 -05:00                                             

然后您可以使用 the trunc() function 将时间部分截断为午夜;这也将它从时间戳隐式转换为日期:

SELECT TRUNC(TO_TIMESTAMP_TZ('2015-11-04 13:45:19.387-05:00','YYYY-MM-DD HH24:MI:SS.FFTZH:TZM'))
FROM DUAL;

TRUNC(TO_TIMESTAMP_TZ('2015-11-0413:45:19.387-05:00','YYYY-MM-DDHH24:MI:SS.FFTZH
--------------------------------------------------------------------------------
04-NOV-15                                                                       

这会忽略实际时区 - 基本上假设值在您的系统时区内(即您在同一 -05:00 区域)。

您还可以在转换之前使用子字符串从原始字符串中去除时间和时区部分:

SELECT TO_DATE(SUBSTR('2015-11-04 13:45:19.387-05:00', 1, 10), 'YYYY-MM-DD')
FROM DUAL;

TO_DATE(SUBSTR('2015-11-0413:45:19.387-05:00',1,10),'YYYY-MM-DD')
-----------------------------------------------------------------
04-NOV-15        

... 或者如果您愿意,可以在 C# 中执行子字符串,假设正在解析 XML 文档。

(这些是有意以不同于 ISO 标准的格式显示的,因此它们看起来不像 XML 中的原始字符串值;它们是带有时区的实际 date/timestamp类型,我的客户只是在使用我的 NLS 设置。)

您还可以选择使用 Oracle 的内置 XML 处理从文档中提取关系数据,但这有点离题并且可能不合适。