【问题标题】:Convert timestamp to date in Oracle SQL在 Oracle SQL 中将时间戳转换为日期
【发布时间】:2016-09-30 07:04:47
【问题描述】:

我们如何将时间戳转换为日期?

该表有一个字段start_ts,其格式为timestamp

'05/13/2016 4:58:11.123456 PM'

我需要查询表格并在表格中找到最大值和最小值timestamp,但我做不到。

Select max(start_ts) 
from db 
where cast(start_ts as date) = '13-may-2016'

但是查询没有返回任何值。

请帮我找出日期的最大时间戳。

【问题讨论】:

标签: sql oracle datetime oracle11g timestamp


【解决方案1】:
CAST(timestamp_expression AS DATE)

例如,查询是:SELECT CAST(SYSTIMESTAMP AS DATE) FROM dual;

【讨论】:

  • 将数据转换为常数(例如cast(start_ts as date) = '13-may-2016')对于性能来说非常糟糕,因为它会影响对刚刚转换的列上的索引的访问,除非您构建基于函数的索引并使用相同的索引查询中的函数。研究sargable.
【解决方案2】:

尝试改用TRUNCTO_DATE

WHERE
    TRUNC(start_ts) = TO_DATE('2016-05-13', 'YYYY-MM-DD')

或者,您可以使用>=< 来避免使用start_ts 列中的函数:

WHERE
   start_ts >= TO_DATE('2016-05-13', 'YYYY-MM-DD')
   AND start_ts < TO_DATE('2016-05-14', 'YYYY-MM-DD')

【讨论】:

  • 我尝试过使用它,但由于时间戳包含以毫秒为单位的 AM / PM,它不会返回任何值。
【解决方案3】:

选择时格式如下:

to_char(systimestamp, 'DD-MON-YYYY')

例如:

select to_char(systimestamp, 'DD-MON-YYYY') from dual;

【讨论】:

  • to_char() 函数在您想将 TIMESTAMP 转换为字符串日期表示时很有用。
【解决方案4】:

如果数据类型是时间戳,那么可见格式是无关紧要的。

您应避免将数据转换为日期或使用 to_char。而是使用 TO_TIMESTAMP() 将时间戳数据与时间戳值进行比较

WHERE start_ts >= TO_TIMESTAMP('2016-05-13', 'YYYY-MM-DD')
   AND start_ts < TO_TIMESTAMP('2016-05-14', 'YYYY-MM-DD')

【讨论】:

  • 如果表格包含多个日期的数据并且表格没有任何日期字段。使用时间戳字段标识日期。那么我们如何找到特定日期的最大和最小时间戳呢??
  • MIN 和 MAX 仍然适用于时间戳。这种数据类型只是存储日期和时间的一种非常准确的方式
  • 是的,我同意.. 我们可以找到当天的最大时间戳,但我们如何才能找到最新日期的最小时间戳。如果我们用户从 db 中选择 min(start_ts),那么它将返回表中存在的最小时间戳。它不会是最新日期的最小时间戳。由于缺少日期列,我们如何找到最新日期的最小时间戳。??
  • 您选择的答案不能解决此最近的评论。实际上你有一个新问题。
  • 选错了..我应该发布一个新问题吗...或者您知道答案..如果您能回复就太好了...
【解决方案5】:

你可以试试简单的

select to_date('2020-07-08T15:30:42Z','yyyy-mm-dd"T"hh24:mi:ss"Z"') from dual;

【讨论】:

  • 是的,当您将时间戳记作为字符串时,上述内容是有意义的。如果您直接阅读时间戳列,那么下面是有意义的。 to_char(systimestamp, 'DD-MON-YYYY')
【解决方案6】:

你可以使用:

select to_date(to_char(date_field,'dd/mm/yyyy')) from table

【讨论】:

    【解决方案7】:

    我会选择以下内容:

    Select max(start_ts) 
    from db 
    where trunc(start_ts) =  date'13-may-2016'
    

    【讨论】:

      【解决方案8】:

      如果日期字符串中有毫秒,则可以使用以下内容。

      select TO_TIMESTAMP(SUBSTR('2020-09-10T09:37:28.378-07:00',1,23), 'YYYY-MM-DD"T"HH24:MI:SS:FF3')From Dual;
      

      然后将其转换为日期:

      select trunc(TO_TIMESTAMP(SUBSTR('2020-09-10T09:37:28.378-07:00',1,23), 'YYYY-MM-DD"T"HH24:MI:SS:FF3')) From Dual;
      

      它对我有用,希望它也能帮助你。

      【讨论】:

        【解决方案9】:

        这可能不是正确的方法。但是我已经使用子字符串函数解决了这个问题。

        Select max(start_ts), min(start_ts)from db where SUBSTR(start_ts, 0,9) ='13-may-2016'
        

        使用这个我能够检索最大和最小时间戳。

        【讨论】:

          猜你喜欢
          • 2016-06-07
          • 1970-01-01
          • 1970-01-01
          • 2017-12-12
          • 1970-01-01
          • 1970-01-01
          • 2021-04-23
          • 2014-05-16
          • 2014-12-03
          相关资源
          最近更新 更多