如何以特定格式在Oracle中插入时间戳

时间:2017-05-17 22:02:53

标签: oracle

我不知道如何以不同于默认格式的格式插入当前时间。有人可以帮忙解释一下吗?

以下是我的表格创建方式:

CREATE TABLE ACTIVITY_LOG 
(
TIME TIMESTAMP NOT NULL 
, ACTIVITY VARCHAR2(200) NOT NULL 
);

我的插入命令有效:

insert into activity_log 
values (localtimestamp,'blah');

但是如何使用各种MM DD YY HH MM SS标签以不同的格式将localtimestamp值插入到我的表中?我已经尝试了以下内容,但它给了我ORA-1830:日期格式图片在转换整个输入字符串错误之前结束。

insert into activity_log
values (to_timestamp(localtimestamp,'YYYY/MM/DD'),'blah');

2 个答案:

答案 0 :(得分:3)

您不能以特定格式插入时间戳。时间戳(和日期)使用内部表示存储在数据库中,内部表示根据类型和精度在7和11字节之间。 There is more about that in this question等等。

您的客户或应用程序决定如何以人类可读的字符串形式显示该值。

当你这样做时:

to_timestamp(localtimestamp,'YYYY/MM/DD')

您隐式将localtimestamp转换为字符串,使用会话的NLS设置,然后将其转换回时间戳。这可能偶然会改变价值 - 失去精确度 - 但不会改变价值在内部存储的方式。在您的情况下,NLS设置与您提供的格式之间的不匹配会导致ORA-01830错误。

所以你的第一个插入是正确的(假设你真的想要会话时间,而不是服务器时间)。如果您希望以特定格式查看存储的值,则可以更改客户端会话的NLS设置,或者最好在查询时明确格式化,例如:

select to_char(time, 'YYYY-MM-DD HH24:MI:SS.FF3') from activity_log

答案 1 :(得分:1)

您似乎没有提供任何关于“本地时间戳”的指示 - 是伪代码吗?变量名?您没有显示?

定义的列

什么数据类型是'localtimestamp'?它包含哪些数据?其他答案指出的相关问题,因为如果它确实是一个时间戳,那么oracle会将它转换为字符串,然后在最终查询中将该字符串传递给to_timestamp()。如果变量是一个包含时间戳

的时间戳,那么你最初的工作就应该有效

最终“日期格式图片结束”意味着“你传给我的字符串看起来像'2017-05-17 12:45:59',但声称它只是'yyyy-mm-dd'。我期待的是什么与剩下的一起做什么?“

您当前对您的问题的最终评论“我希望看到桌面并查看有用的观看时间” - 这是您的查询工具的问题。查看查询工具的设置并更改其显示的日期格式。如上所述,oracle中的日期自某个特定时刻起存储为十进制数天。如果0代表1970年1月1日,则1.75代表1970年1月2日下午6点。这取决于用户使用的最终程序,将日期格式化为您喜欢的内容..您不能“插入具有不同格式的时间戳”因为时间戳的格式不超过1.75这样的数字格式。这是你的查询在获取它时用它做的事情,它给出了格式:

To_char(timestampcol, 'yyyy mm did')
To-char(tomestampcol, 'mon dd yyyy')

这些使用日期格式化程序中的oracles,将日期的十进制数转换为给定格式的字符串;你会看到一个字符串..或者你可以只写“select * from table”并在TOAD中运行它,toad会根据设置中的格式显示日期,或者你可以编写ac#program并获得一个日期加载对象并调用我的date.ToString(“yyyy-MM-dd”)来格式化它们。我想要了解的想法是你没有在路上选择日期格式,你在出路时选择它,如果你不喜欢你正在看的东西,你必须改变它在出路上,而不是在

中的方式