在视图中将 Unix 时间戳转换为 DATETIME

Jos*_*ton 7 oracle oracle-11g timestamp date-format

我有一个存储 unix 时间戳的表。要将其作为日期查询,我正在尝试将此时间戳转换为视图中的日期时间类型。不幸的是,我似乎只能取出 DATE 部分。

此链接描述了如何进行转换,但需要更改nls_date_format以包含时间部分。默认当前仅显示日期部分。我需要日期和时间。

不幸的是,该解决方案仅适用于会话级别。作为开发人员,我宁愿不必跑到我们的托管服务提供商那里要求他们更改数据库级别的值 - 特别是因为它可能会影响其他应用程序。

有没有一种方法可以在不修改系统的情况下将 sql 中的时间戳转换为日期时间?

mir*_*173 12

表达式的结果

to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(1244108886,'SECOND')
Run Code Online (Sandbox Code Playgroud)

是 oracle 数据类型 DATE 的值。此类型包含日期和时间。如果要向用户显示此值,则必须将其转换为字符串。这种转换可以由应用程序完成,或者您可以让 oracle 将其转换为字符串类型,就像在本示例中所做的那样。这种到oracle stringtype VARCHAR2 的自动转换由nls_date_format 和一些服务器设置控制。如果您希望视图以“YYYY-MM-DD HH24:MI:SS”格式而不是 DATE 值的格式返回计算日期的 VARCHAR2 值,您可以使用转换函数:表达式

to_char(to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(1244108886,'SECOND'),'YYYY-MM-DD HH24:MI:SS')
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,视图的返回值是 VARCHAR2 而不是 DATE 值。


小智 5

最佳实践是避免 SQL 查询中的非 SQL 函数调用,因为该函数可能并非普遍可用——在我的系统中没有 numtodsinterval 函数——也是因为将上下文从 SQL 切换到 PL/SQL 的额外开销,然后如果在 where 子句中调用该函数,则为返回或测试的每一行返回 SQL。

这是一个仅 SQL 的解决方案。

TO_DATE('1970-01-01','YYYY-MM-DD') + unix_timestamp / 86400
Run Code Online (Sandbox Code Playgroud)

请注意,结果是一个 Oracle DATE 值,它也包含 TIME。如果在您运行查询时它似乎没有 TIME,则问题出在您的 NLS_DATE_FORMAT 或您的 UI 将日期转换为字符串的实现中。请务必使用格式字符串中的时间部分自己执行 TO_CHAR 以查看整个值。例如 TO_CHAR(a_date, 'yyyy-mm-dd hh24:mi:ss')