繁体   English   中英

如何在SQL中转换日期格式

[英]how to convert date format in sql

如果我有这样的日期/时间

8/5/2014 12:00:01 AM
8/5/2014 12:00:16 AM
8/5/2014 12:00:18 AM
8/5/2014 12:17:18 AM
8/5/2014 12:19:18 AM

我想要这些日期/时间

  • 如果分钟数少于15且大于00,我希望分钟数为00
  • 如果分钟数少于30且大于15,我希望分钟数为15
  • 如果分钟数少于45且大于30,我希望分钟数为30
  • 如果分钟数小于00且大于45,我希望分钟数为45

     8/5/2014 12:00:00 AM ... ... 8/5/2014 12:15:00AM ... ... 8/5/2014 12:30:00AM ... ... 8/5/2014 12:45:00AM 

我需要针对我的报告执行此操作,如何在Oracle中应用这些

这是一种方法。 提取日期,然后以小时和分钟的形式添加所需的内容:

select trunc(dt) + extract(hour from dt) / 24.0 +
       (trunc(extract(minute from dt) / 15) * 15) / (24.0 * 60);

这利用了一个事实,即+表示日期会增加几天。 这三个术语是原始日期为午夜,将小时数转换为天数(因此为/ 24 ),而第三个术语是分钟数(适当舍入)。

这是另一种方法,实际上是Gordon Linoff方法的一种变体:

trunc(dt, 'HH24') + ((15/1440) * (floor(to_number(to_char(dt, 'MI'))/15)))

trunc(dt, 'HH24')为您提供截断为小时精度的值,因此对于您的样本始终为午夜。 然后floor(to_number(to_char(dt, 'MI'))/15)给出由分钟值表示的完整15分钟周期的数量; 数据为零或1。正如Gordon所提到的,当您向日期添加数字值时,它被视为一天的一部分,因此需要乘以“ 15分钟”(15/1400)。

with t as (
  select to_date('8/5/2014 12:00:01 AM') as dt from dual
  union all select to_date('8/5/2014 12:00:16 AM') as dt from dual
  union all select to_date('8/5/2014 12:00:18 AM') as dt from dual
  union all select to_date('8/5/2014 12:17:18 AM') as dt from dual
  union all select to_date('8/5/2014 12:19:18 AM') as dt from dual
  union all select to_date('8/5/2014 12:37:37 AM') as dt from dual
  union all select to_date('8/5/2014 12:51:51 AM') as dt from dual
)
select dt, trunc(dt, 'HH24')
    + ((15/1440) * (floor(to_number(to_char(dt, 'MI'))/15))) as new_dt
from t;

DT                     NEW_DT               
---------------------- ----------------------
08/05/2014 12:00:01 AM 08/05/2014 12:00:00 AM 
08/05/2014 12:00:16 AM 08/05/2014 12:00:00 AM 
08/05/2014 12:00:18 AM 08/05/2014 12:00:00 AM 
08/05/2014 12:17:18 AM 08/05/2014 12:15:00 AM 
08/05/2014 12:19:18 AM 08/05/2014 12:15:00 AM 
08/05/2014 12:37:37 AM 08/05/2014 12:30:00 AM 
08/05/2014 12:51:51 AM 08/05/2014 12:45:00 AM 

要添加另一种方法,这看起来像函数NUMTODSINTERVAL()可能有用的情况-它使正在发生的事情更加明显:

select trunc(dt) 
       + numtodsinterval(trunc(to_char(dt, 'sssss') / 900) * 15, 'MINUTE')
  from ...

TRUNC()将日期截断到该天的开始。 格式模型 sssss计算自午夜以来的秒数。 自午夜以来完整的四分之一小时数是秒数除以900(因为一天中有900个四分之一小时数)。 再次将其截断以删除部分完成的季度小时数,再乘以15即可得到分钟数(每25分钟中有15分钟)。 最后,将其转换为INTERVAL DAY TO SECOND并添加到原始日期。

SQL> alter session set nls_date_format = 'dd/mm/yyyy hh24:mi:ss';

Session altered.

SQL> with t as (
  2   select to_date('05/08/2014 12:00:01') as dt from dual union all
  3   select to_date('05/08/2014 12:00:16') as dt from dual union all
  4   select to_date('05/08/2014 12:00:18') as dt from dual union all
  5   select to_date('05/08/2014 12:17:18') as dt from dual union all
  6   select to_date('05/08/2014 12:19:18') as dt from dual union all
  7   select to_date('05/08/2014 12:37:37') as dt from dual union all
  8   select to_date('05/08/2014 12:51:51') as dt from dual
  9  )
 10  select trunc(dt)
 11         + numtodsinterval(trunc(to_char(dt, 'sssss') / 900) * 15, 'MINUTE')
 12    from t
 13         ;

TRUNC(DT)+NUMTODSIN
-------------------
05/08/2014 12:00:00
05/08/2014 12:00:00
05/08/2014 12:00:00
05/08/2014 12:15:00
05/08/2014 12:15:00
05/08/2014 12:30:00
05/08/2014 12:45:00

7 rows selected.

我已经明确设置了我的NLS_DATE_FORMAT,因此我可以依靠TO_DATE()隐式转换,使其适合页面而无需滚动。 建议通常使用隐式转换。

这是带有实际日期的ORACLE的示例:

select trunc(sysdate,'HH')+trunc(to_number(to_char(sysdate,'MI'))/15)*15/24/60
from dual;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM