假设这有一个简单的解决方案,但我找不到它。
我正在尝试在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字段仍包含一些剩余时间元素。我怎样才能重置这些??
谢谢!
答案 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
代表
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;