【问题标题】:Oracle Timestamp Conversion with Dates带有日期的 Oracle 时间戳转换
【发布时间】:2013-02-08 19:06:23
【问题描述】:

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

我正在尝试对 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 字段在转换为时间戳时仍然包含一些剩余时间元素。我怎样才能重置这些??

谢谢!

【问题讨论】:

  • 首先,定义“没用”。你得到了什么结果?你预期的结果是什么?当您谈论“剩余时间元素”时,您是否试图从 MyDate 的任何一天的午夜减去 100 小时,而不是从 MyDate 的任何时间减去 100 小时?您希望查询返回什么数据类型?您发布的查询返回 timestamp,但如果您正在谈论想要一种特定格式,则意味着您想要返回 varchar2
  • 抱歉不够清楚。如果 MyDate 是2013-01-15,我希望得到2013-01-10 20:00。我没有得到这个 - 我得到像2013-01-10 21:49 这样的东西。我发现“MyDate”在转换为时间戳时会保留小时和分钟,而不是 00:00 - 不知道为什么。所以...我试图在时间戳转换后将 MyDate 的时间部分归零,但我不知道该怎么做。

标签: sql oracle date timestamp


【解决方案1】:

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

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

【讨论】:

  • 您可能希望将格式化结果的 to_char() 添加到您的答案中。由你决定。
  • 很好的答案,谢谢!一个问题,如何将 to_char 输出转换回时间戳以便与当前系统日期进行比较?
  • 如果我正确阅读了海报的 cmets,他们会想trunc 减去之前的日期而不是之后的日期。否则,在他们发布的示例中,如果 MyDate2013-01-15 01:49:00,他们将得到 2013-01-10 00:00:00 而不是 2013-01-10 20:00:00
【解决方案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

【讨论】:

  • 我猜真正的 Oracle 例子对用户来说太复杂了)
【解决方案3】:

在 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)。

【讨论】:

    【解决方案4】:

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

    示例:- Mod_date 03-NOV-12 12.00.00.000000000 AM

    查询:-

    select Mod_date from fil_cnfact where Mod_date

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 2016-06-07
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      相关资源
      最近更新 更多