0

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

我正在尝试对 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

4 回答 4

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
于 2013-02-08T19:13:46.983 回答
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
于 2013-02-08T19:15:31.540 回答
1

在 Oracle 中,aDATE始终具有日期和时间组件。根据您使用的工具和会话的不同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)。

于 2013-02-08T19:26:22.457 回答
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 ;

于 2013-03-08T19:52:01.903 回答