【发布时间】:2021-08-18 22:57:39
【问题描述】:
您好,我有这个专栏:DATETIME_UTC as timestamp(9):
2/3/2019 1:27:00.000000 AM
如何在 select 语句中将此列转换为:
2/3/2019 1:27:00 AM
只需要删除毫秒。只需要转换并保持为日期
问候
【问题讨论】:
-
cast(..... as date)
您好,我有这个专栏:DATETIME_UTC as timestamp(9):
2/3/2019 1:27:00.000000 AM
如何在 select 语句中将此列转换为:
2/3/2019 1:27:00 AM
只需要删除毫秒。只需要转换并保持为日期
问候
【问题讨论】:
我的完整测试脚本:
set linesize 32000
set pagesize 1000
set head on
set echo on
set termout on
set trimspool on
spool test2.log
-- https://stackoverflow.com/questions/68840203/oracle-convert-datetime-without-milliseconds
-- desired format 2/3/2019 1:27:00 AM
alter session set nls_date_format='MM/DD/YYYY HH12:MI:SS AM';
drop table test;
create table test (datetime_utc timestamp(9));
insert into test values (to_timestamp('02/03/2019 01:27:00.000000 AM','MM/DD/YYYY HH:MI:SS.FF6 AM'));
commit;
select datetime_utc from test;
-- general approach to change dates and times
-- convert to string and back
select to_date(to_char(datetime_utc,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS') from test;
-- suggested in comments - simpler way to just truncate milliseconds
select cast(datetime_utc as date) from test;
spool off
输出的最后一部分:
SQL> select datetime_utc from test;
DATETIME_UTC
---------------------------------------------------------------------------
03-FEB-19 01.27.00.000000000 AM
SQL>
SQL> -- general approach to change dates and times
SQL> -- convert to string and back
SQL>
SQL> select to_date(to_char(datetime_utc,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS') from test;
TO_DATE(TO_CHAR(DATETI
----------------------
02/03/2019 01:27:00 AM
SQL>
SQL> -- suggested in comments - simpler way to just truncate milliseconds
SQL>
SQL> select cast(datetime_utc as date) from test;
CAST(DATETIME_UTCASDAT
----------------------
02/03/2019 01:27:00 AM
对于这个问题,强制转换是更有效的解决方案,但转换为字符串并返回日期可以解决许多日期和时间问题,因此它是一种更通用的解决方案。
鲍比
【讨论】:
cast(datetime as date)
您在同一时间显示两次。 2/3/2019 1:27:00.000000 AM 与 2/3/2019 1:27:00 AM 的时间戳完全相同。这只是显示它的另一种方式。 February 3, 2019 01:27 是另一个,还有很多其他的显示方式。
因此,您似乎不想在此处删除任何内容,而只是以不同的方式显示时间戳。这通常在您的应用程序或网站中完成,因此时间戳会根据用户的操作系统设置显示。 (例如,我认为这可能是 03.02.2019 01:27,因为我的 Windows 有德语设置)。
但您也可以要求 Oracle 将时间戳转换为所需格式的字符串。这是通过TO_CHAR 完成的。例如
select to_char(ts, 'mm/dd/yyyy hh:mi:ss am') from mytable;
这可以用于例如当您想要将结果写入文件并且您需要一个固定的时间戳格式时。
如果这是关于您的 SQL 工具(例如 SQL Developer 或 Toad),您可能可以在那里设置默认值,如何显示日期和时间戳。
【讨论】: