在Oracle中更新日期

时间:2018-01-18 15:03:04

标签: sql oracle oracle12c

我有一个包含多个日期的列的表格如下?

15-JAN-2018 07:18:09
13-JAN-2018 09:09:19
15-JAN-2018 05:29:21
15-JAN-2018 05:30:26
13-JAN-2018 07:23:19
13-JAN-2018 02:30:12
14-JAN-2018 02:30:12
14-JAN-2018 03:30:12

是否可以将所有这些日期转换为关于小时/分钟的第12个日期,如下所示:

12-JAN-2018 07:18:09
12-JAN-2018 09:09:19
12-JAN-2018 05:29:21
12-JAN-2018 05:30:26
12-JAN-2018 07:23:19
12-JAN-2018 02:30:12
12-JAN-2018 02:30:12
12-JAN-2018 03:30:12

3 个答案:

答案 0 :(得分:2)

如果我理解得很清楚你可能需要这样的东西。

开始数据:

SQL> select * from dates;

D
-------------------------------------------------
15-JAN-18 12:34:45,000000000
14-JAN-18 12:12:45,000000000
11-JAN-18 12:34:45,000000000
12-JAN-18 12:00:45,000000000

更新

SQL> update dates
  2  set d =  d - trunc(d) + date '2018-01-12';

4 rows updated.

结果:

SQL> select * from dates;

D
-------------------------------------------------
12-JAN-18 12:34:45,000000000
12-JAN-18 12:12:45,000000000
12-JAN-18 12:34:45,000000000
12-JAN-18 12:00:45,000000000

这只是将时间作为开始日期的一部分,并将其添加到2018-01-12 00:00

答案 1 :(得分:2)

你可以在这里使用这个概念:

select sysdate, 
       to_date( '12'||to_char(sysdate,'MMYYYYHH24MISS'), 'DDMMYYYYHH24MISS' )
  from dual;

sysdate替换为您的字段名称(在第二个选定元素中),将dual替换为您的表名。

这会通过预先设置您想要的月份日期来重新构建日期。由于我们已经将'MMYYYYHH24MISS'传入的格式定义为12,因此DD就像对iNetworkSubscriber部分进行硬编码一样。

上面的select语句从概念上演示了您需要做什么。在不知道你的专栏名称和表格名称的情况下,很难构建一个确切的答案,但我认为如果你完全按照它所写的那样执行上述陈述,你将会得到它的要点(它&& #39; s无害)。

答案 2 :(得分:2)

您可以按日间隔进行调整:

your_date - numtodsinterval(extract(day from your_date) - 12, 'DAY')

演示:

alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';

with t (dt) as (
  select to_date('15-JAN-2018 07:18:09', 'DD-MON-YYYY HH24:MI:SS') from dual
  union all select to_date('13-JAN-2018 09:09:19', 'DD-MON-YYYY HH24:MI:SS') from dual
  union all select to_date('15-JAN-2018 05:29:21', 'DD-MON-YYYY HH24:MI:SS') from dual
  union all select to_date('15-JAN-2018 05:30:26', 'DD-MON-YYYY HH24:MI:SS') from dual
  union all select to_date('13-JAN-2018 07:23:19', 'DD-MON-YYYY HH24:MI:SS') from dual
  union all select to_date('13-JAN-2018 02:30:12', 'DD-MON-YYYY HH24:MI:SS') from dual
  union all select to_date('14-JAN-2018 02:30:12', 'DD-MON-YYYY HH24:MI:SS') from dual
  union all select to_date('14-JAN-2018 03:30:12', 'DD-MON-YYYY HH24:MI:SS') from dual
)
select dt, dt - numtodsinterval(extract(day from dt) - 12, 'DAY')
from t;

DT                  DT-NUMTODSINTERVAL(
------------------- -------------------
2018-01-15 07:18:09 2018-01-12 07:18:09
2018-01-13 09:09:19 2018-01-12 09:09:19
2018-01-15 05:29:21 2018-01-12 05:29:21
2018-01-15 05:30:26 2018-01-12 05:30:26
2018-01-13 07:23:19 2018-01-12 07:23:19
2018-01-13 02:30:12 2018-01-12 02:30:12
2018-01-14 02:30:12 2018-01-12 02:30:12
2018-01-14 03:30:12 2018-01-12 03:30:12

extract(day from your_date)会为您提供日期编号,例如从中减去12可以得出每个值与当月12日之间的天数差异(样本中总是为正值,但也可能为负值)。 numtodsinterval() function转换为间隔的偏移量。并且该间隔应用于原始值。