仅更新日期而不修改时间

时间:2013-08-21 07:03:43

标签: sql oracle oracle10g

我的数据库表中的数据为

last_updated_product
01/Jan/1899 6:25:01 AM
01/Jan/1899 6:25:02 AM

如何在不修改时间部分的情况下仅使用sysdate更新日期部分? 预计出局

21/Aug/2013 6:25:01 AM
21/Aug/2013 6:25:02 AM

last_updated_product列数据类型定义为date

由于

3 个答案:

答案 0 :(得分:5)

您需要在当天使用午夜,并从原始值添加时间部分:

trunc(sysdate) + (last_updated_product - trunc(last_updated_product))

trunc()为您提供时间组件设置为00:00:00的日期,因此date - trunc(date)只提供原始时间组件,作为一个数字(一天的一小部分) datetime arithmetic rules。那么这个数字可以加到今天的午夜。

不确定您是在实际更新表格还是仅仅在查询中执行此操作,但无论如何都是相同的计算。

答案 1 :(得分:2)

您可以计算时间部分并添加所需日期,例如:

update my_table
   set last_updated_product = 
              to_date('21/Aug/2013', 'dd/Mon/yyyy')
              -- difference between the start of the day and the time
              + (last_updated_product - trunc(last_updated_product))

额外的括号是为了确保查询按照操作员的优先顺序工作,因为您无法在日期中添加日期,但可以添加间隔。括号确保在添加之前评估last_updated_product - trunc(last_updated_product)

或将其转换为字符,将其连接到日期,然后将其转换回日期。

update my_table
   set last_updated_product = 
             to_date('21/Aug/2013' || to_char(last_updated_product, 'hh24:mi:ss')
                     , 'dd/Mon/yyyyhh24:mi:ss')

e.g。

create table my_table ( last_updated_product date );

Table created.

insert into my_table values (sysdate - 100);

1 row created.

update my_table
   set last_updated_product =
          to_date('21/Aug/2013', 'dd/Mon/yyyy')
          + (last_updated_product - trunc(last_updated_product))
       ;

1 row updated.

select * from my_table;

LAST_UPDATED_PRODUC
-------------------
2013/08/21 08:13:57

答案 2 :(得分:0)

   update <table>
      set last_updated_product = 
               last_updated_product 
             - trunc(last_updated_product )
             + trunc(sysdate)
    where <condition>
        ;