带时间的Oracle时间戳转换

时间:2013-02-08 19:06:24

标签: sql oracle date timestamp

假设这有一个简单的解决方案,但我找不到它。

我正在尝试在Oracle的DATE字段上做一些逻辑。我的愿望是采用DATE字段并从中减去X小时。

例如:SELECT A.MyDATE - 100 Hours from dual;

但是,我需要一个时间戳格式为'YYYY-MM-DD hh:mm'的结果。

我已经尝试了CAST(A.MyDATE as TIMESTAMP) - NUMTODSINTERVAL(100/24,'day'),但它没有用。

我发现问题在于,当转换为时间戳时,MyDATE字段仍包含一些剩余时间元素。我怎样才能重置这些??

谢谢!

4 个答案:

答案 0 :(得分:2)

你可以用减法来做到这一点:

select a.MyDate - 100.0/24

转换为varchar:

select to_char(a.MyDate - 100.0/24, 'YYYY-MM-DD')

而且,如果你想摆脱那个讨厌的时间:

select trunc(a.MyDate - 100.0/24) as JustTheDate

答案 1 :(得分:2)

我的示例中的格式和日期可以更改为任何其他格式和日期:

SELECT To_Timestamp(To_Char(Sysdate - INTERVAL '100' HOUR, 'MM/DD/YYYY HH24:MI'), 'MM/DD/YYYY HH24:MI')
 FROM dual
/

Output:

2/4/2013 10:18:00.000000000 AM


To remove time element add Trunc() to any of your dates...:

SELECT Trunc(To_Timestamp(To_Char(Sysdate - INTERVAL '100' HOUR, 'MM/DD/YYYY HH24:MI'), 'MM/DD/YYYY HH24:MI'))
FROM dual
/

Output: 2/4/2013


Conversion/Casting - when using other dates in place of sysdate then add formats as in my other examples:

SELECT CAST(SYSDATE AS TIMESTAMP) - INTERVAL '100' HOUR FROM dual
/

Output: 2/4/2013 10:26:35.000000000 AM


SELECT start_date tstamp_to_date, CAST(start_date AS timestamp) date_to_tstamp FROM
 (
  SELECT to_date(to_char(to_timestamp ('2013-02-07 10:07:47.000' , 'YYYY-MM-DD HH24:MI:SS.FF'),'DD-MON-YYYY HH24:MI:SS'), 'DD-MON-YYYY HH24:MI:SS') start_date
  FROM dual
 )
/

Output:

tstamp_to_date          date_to_tstamp 
-------------------------------------------------------
2/7/2013 10:07:47 AM    2/7/2013 10:07:47.000000 AM

答案 2 :(得分:1)

在Oracle中,DATE始终包含日期和时间组件。根据您使用的工具和会话的NLS_DATE_FORMAT,当您查看数据时,工具完全有可能无法显示时间组件。但这只是一个显示问题,它对实际数据没有影响。

如果您想在MyDate代表

的那天从午夜减去100小时
SELECT TRUNC(MyDate) - interval '100' hour
  FROM dual

这将返回DATE。如果要以特定格式返回字符串

SELECT TO_CHAR( TRUNC(MyDate) - interval '100' hour,  'YYYY-MM-DD hh:mi am' )
  FROM dual

请注意,我假设您的问题中存在拼写错误。我假设您要显示小时后的分钟数(mi)而不是月份(mm)。

答案 3 :(得分:0)

我正在尝试获取超过30天的记录(来自Mod_date),我正在使用以下查询,它返回所有数据,我只想要30天的数据。

样本: - Mod_date 03-NOV-12 12.00.00.000000000 AM

查询: -

从fil_cnfact中选择Mod_date,其中Mod_date< = sysdate -30 order by Mod_date asc;