获取特定格式的当前时间戳,秒数到一位小数

时间:2016-06-21 13:27:51

标签: oracle datetime

我试图在Oracle数据库中设置一个类似于以下内容的值:

2016-06-21 03:07:25.0

它是当前日期的varchar,小数位后的一位数表示秒。我尝试了多种方法来实现这一目标,但无济于事:

SQL> select sysdate from dual;

SYSDATE
--------
21-06-16

从此我试过了:

SQL> alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS.F';
ERROR:
ORA-01821: date format not recognized

SQL> alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS.s';
ERROR:
ORA-01821: date format not recognized

然后我尝试了:

SQL> SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM dual;

TO_CHAR(SYSDATE,'YY
-------------------
2016-06-21 12:58:55

由于这种情况达到了几秒钟,我尝试了小数部分:

SQL> SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS.SSSS') from dual;

TO_CHAR(SYSDATE,'YYYY-MM
------------------------
2016-06-21 13:23:47.4747

所以我可以得到4个重要的地方。现在我只尝试1:

SQL> SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS.S') from dual;
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS.S') from dual
                       *
ERROR at line 1:
ORA-01821: date format not recognized

那么如何将秒设置为小数点后一位的上述格式的当前时间戳?

1 个答案:

答案 0 :(得分:3)

SSSS不是小数秒。它只是重复SS值两次;在你的例子中你得到13:23:47.4747 - 4747只显示了47次两次。也许你在考虑SSSSS,但那是自午夜(即0-86399)以来的秒数,所以在这里也没有用。单个S不是valid format model element

日期不具备小数秒精度。单个F也不是有效的格式模型元素,但即使FF也不适用于某个日期。

您需要使用systimestamp来获取小数秒的服务器时间,而不是sysdate

select to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS.FF1') from dual;

TO_CHAR(SYSTIMESTAMP,'YYYY-MM
-----------------------------
2016-06-21 14:42:22.7        

将日期/时间存储为字符串通常是一个坏主意。我建议您创建列timestamp(1),当您从systimestamp设置时,该列将保持一位小数位的精度。您可以通过cast了解它的内容:

select to_char(cast(systimestamp as timestamp(1)), 'YYYY-MM-DD HH24:MI:SS.FF9') from dual;

TO_CHAR(CAST(SYSTIMESTAMPASTI
-----------------------------
2016-06-21 14:49:09.900000000

将日期/时间转换为字符串应该仅用于显示,而不是用于存储。