仅从oracle sql中的给定时间戳提取日期

kum*_*prd 14 sql database-administration oracle10g

以下查询:

select cdate from rprt where cdate <= TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS') and ryg='R' and cnum='C002';
Run Code Online (Sandbox Code Playgroud)

return:2013/04/27-10:06:26:794存储在表中.

我想将日期仅作为:27-04-2013并获得结果tdate和sysdate之间的天数.

Fer*_*o. 20

使用函数cast()将时间戳转换为日期

select to_char(cast(sysdate as date),'DD-MM-YYYY') from dual;
Run Code Online (Sandbox Code Playgroud)

有关函数cast oracle11g的更多信息http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions016.htm#SQLRF51256


Piy*_*Dua 11

在 Oracle 11g 中,要从时间戳中获取完整日期,请使用以下命令:

Select TRUNC(timestamp) FROM TABLE_NAME;
Run Code Online (Sandbox Code Playgroud)

要从时间戳获取年份,请使用此-

Select EXTRACT(YEAR FROM TRUNC(timestamp)) from TABLE_NAME;
Run Code Online (Sandbox Code Playgroud)

要从时间戳获取月份,请使用此-

Select EXTRACT(MONTH FROM TRUNC(timestamp)) from TABLE_NAME;
Run Code Online (Sandbox Code Playgroud)

要从时间戳中获取日期,请使用此-

Select EXTRACT(DAY FROM TRUNC(timestamp)) from TABLE_NAME;
Run Code Online (Sandbox Code Playgroud)


mvp*_*mvp 9

这正是TO_DATE()用于:将时间戳转换为日期.

只需使用TO_DATE(sysdate)而不是TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS').

SQLFiddle演示

更新:

根据您的更新,您的cdate列不是真实的DATE或TIMESTAMP类型,但是VARCHAR2.使用字符串类型来保存日期并不是一个好主意.在日期上搜索,比较和做所有其他类型的数学是非常不方便和缓慢的.

你应该将你的cdate VARCHAR2领域转换成真实的TIMESTAMP.假设除了您的代码之外没有该字段的其他用户,您可以转换cdate为时间戳,如下所示:

BEGIN TRANSACTION;
-- add new temp field tdate:
ALTER TABLE mytable ADD tdate TIMESTAMP;
-- save cdate to tdate while converting it:
UPDATE mytable SET tdate = to_date(cdate, 'YYYY-MM-DD HH24:MI:SS');

-- you may want to check contents of tdate before next step!!!

-- drop old field
ALTER TABLE mytable DROP COLUMN cdate;
-- rename tdate to cdate:
ALTER TABLE mytable RENAME COLUMN tdate TO cdate;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

SQLFiddle演示

  • 您不能在时间戳数据类型上使用 to_date。 (3认同)