Oracle:类似于 sysdate 但只返回时间和日期

Posted

技术标签:

【中文标题】Oracle:类似于 sysdate 但只返回时间和日期【英文标题】:Oracle: Similar to sysdate but returning only time and only date 【发布时间】:2011-09-29 22:36:25 【问题描述】:

我了解 Oracle sysdate 返回当前日期和时间。这对于时间戳或日期时间列非常有用。

现在假设我有一个仅 DATE 列。我应该在插入查询中使用哪些关键字?

insert into myTable1(myDateOnlyColumn) values(???)

假设我有一个仅限时间的列。我应该在插入查询中使用哪些关键字?

 insert into myTable2(myTimeOnlyColumn) values(???)

谢谢!

【问题讨论】:

【参考方案1】:

要从sysdate 中删除时间,您只需写TRUNC(sysdate)

例如:

SELECT TRUNC(SYSDATE) "TODAY" FROM DUAL;

会给你:

TODAY                     
------------------------- 
'2012-10-02 00:00:00'     

【讨论】:

【参考方案2】:

Oracle 中不存在仅 DATE 列。 DATE 数据类型存储日期和时间。

如果你只关心日期,你可以:

INSERT INTO tbl (dtCol) VALUES (TO_DATE('20110929','YYYYMMDD');

这会将时间组件留在 00:00:00。不过,您不必显示它。

如果您只对时间组件感兴趣,您仍然可以在列中存储一个日期。您只需要在输出时处理它。例如:

SQL> CREATE TABLE dt (d DATE);

SQL> INSERT INTO dt VALUES (TO_DATE('1:164800','J:HH24MISS'));

1 row inserted

显示列的实际内容表明已插入日期:

SQL> SELECT * FROM dt;

D
--------------------
0/0/0000 4:48:00 PM

仅从列中选择时间分量即可获得所需的输出:

SQL> SELECT TO_CHAR(d, 'HH24:MI:SS') d FROM dt;

D
--------
16:48:00

SQL> 

如果您认为只需要一个时间列,则需要确保始终插入相同的日期组件。

【讨论】:

所以当我存储生日时,它会在时间部分存储全零?仅 TIME 列怎么样? 好答案。此外,如果您的日期包含小时、分钟和秒: trunc(sysdate, 'd') 删除它们而不是使用 TO_CHAR @DCookie - 好答案。不过,我会介绍 INTERVAL 数据类型来存储时间。如果您只存储一个时间,您通常会存储一个完美映射到 INTERVAL DAY TO SECOND 的持续时间(即 4 小时 48 分钟),而不是存储像下午 4:48 这样的时间。 @DCookie:为什么你必须把那个'J'传进去?我可以将 sysdate 插入这些转换以获取当前日期和当前时间吗? @Sergio,您不必这样做,我只是使用 1 的儒略日期将年/月/日部分归零。否则,您最终会在其中找到某种实际日期,如果您尝试实现“仅限时间”列,则可能会混淆问题。【参考方案3】:
select sysdate, to_date(to_char(sysdate, 'dd/mm/yyyy'),'dd/mm/yyyy') d
from dual

【讨论】:

你需要解释为什么这段代码会解决一个已经回答的操作的问题?【参考方案4】:

对于那些正在寻找一个简单的解决方案来只返回没有时间的日期的人,我发现了这个:

to_date(SYSDATE,'dd/mm/yyyy')

像魅力一样工作。 ;-)

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于Oracle:类似于 sysdate 但只返回时间和日期的主要内容,如果未能解决你的问题,请参考以下文章

45个非常有用的Oracle查询语句(转自开源中国社区)

Oracle之trunc函数

为啥 Oracle ADD_MONTHS() 返回的 sysdate 值与我硬编码今天的日期不同?

oracle中关于日期的获取

oracle时间函数

Oracle RAC,sysdate不正确,和机器时间差3小时