我试图在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
那么如何将秒设置为小数点后一位的上述格式的当前时间戳?
答案 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
将日期/时间转换为字符串应该仅用于显示,而不是用于存储。