【问题标题】:How to trim milliseconds of a timestamp field in oracle如何在oracle中修剪时间戳字段的毫秒数
【发布时间】:2018-04-30 19:04:55
【问题描述】:

我有一个表EMPLOYEE,它有两个TIMESTAMP 字段"CRTE_DTM""END_DTM"

我想在顶部 EMPLOYEE 表上创建一个视图,我可以在这两个字段上放置一些函数以返回 TIMESTAMP,精度仅为 3 毫秒。

例子:

如果我在EMPLOYEE 表中有以下行

CRTE_DTM
----------------
10-SEP-02 02.10.10.123000000 PM

我想将时间戳修剪为只有 3 毫秒精度,见下文,

CRTE_DTM
----------------
10-SEP-02 02.10.10.123 PM

注意:我正在使用此视图将数据加载到表中,其中 "CRTE_DTM""END_DTM" 字段是 TIMESTAMP 的

【问题讨论】:

  • "TRIM" 是字符串操作,不是日期或时间戳操作。日期和时间戳(如数字)可以截断四舍五入。你需要哪一个?或者,尽管时间戳字段具有更高的规定精度,但您的所有时间戳是否都只有小数点后三位的秒数?其他人已经提供的一种解决方案是将新列定义为数据类型timestamp(3),并允许Oracle 在将旧表中的值插入新表的过程中进行舍入。这将四舍五入到最接近的毫秒,可以吗?
  • 您显示的两个时间戳是相同的。就像数字 12.34 和 12.34000 一样;小数点后面的尾随零不会更改值。所以没有问题。如果您应该拥有像 02:10:10.1234 这样的时间部分的数据,那么仍然没有真正的问题,因为您始终可以仅以三位数的精度显示它们。如果您确实想防止数据库存储超过三位的十进制精度,请将您的列定义为timestamp(3)

标签: sql oracle timestamp


【解决方案1】:

如果您可以重新创建表(或添加列、复制数据、删除旧的并重命名),则可以使用数据类型TIMESTAMP(3)TIMESTAMP 的默认值为 6 位小数,但可以覆盖。

或者,您可以转换为具有指定格式的字符串,然后(如果您想使用 TIMESTAMP,可以选择)再次返回:

select to_timestamp(
    to_char(crte_dtm, 'YYYY-MM-DD HH24:MI:SS.FF3'),
    'YYYY-MM-DD HH24:MI:SS.FF3') from employee;

【讨论】:

  • 我认为这会失败。当我尝试将TO_CHAR() 与包含两个以上Fs(或少于两个,就此而言)的格式掩码一起使用时,我得到ORA-01821: date format not recognized
  • 抱歉,没有检查。试试 'YYYY-MM-DD HH24:MI:SS.FF3' (docs.oracle.com/cd/B19306_01/server.102/b14200/…)。
【解决方案2】:

您可以尝试以下方法:

CREATE VIEW myview AS
SELECT <other_columns>
     , CAST(crte_dtm AS TIMESTAMP(3)) AS crte_dtm
     , CAST(end_dtm AS TIMESTAMP(3)) AS end_dtm
  FROM employee;

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    10-SEP-02 02.10.10.123000000 PM10-SEP-02 02.10.10.123 PM 的时间戳相同。您可以做的是选择一个字符串以所需格式显示此时间戳:

    select to_char(timestamp_column, 'dd-MON-yy hh24.mi.ss.ff3', 'nls_date_language=english')
    from mytable;
    

    【讨论】:

    • 这会返回一个字符串,但问题是得到一个TIMESTAMP
    • @Wernfried Domscheit:是的。我要说的是:时间戳已经存在。无需转换,因为只有三位数字。因此“问题”可能是查询数据时的默认输出,但始终可以用TO_CHAR 覆盖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多