更改表中数据的日期和时间戳格式

时间:2013-01-03 18:35:30

标签: sql oracle date timestamp-with-timezone

我们有一个庞大的Oracle数据库,其中包含具有日期和时间戳的数据。 现在我们正在使用mm-dd-yyyy format for date and EST Time zone for time stamp

现在我们需要更改date format as yyyy-mm-dd and time stamps should be GMT timezone。 我们需要将表中已有的数据更改为这种新格式以及新插入的数据。

有关如何实现这一目标的任何帮助?

2 个答案:

答案 0 :(得分:4)

更改日期格式只是演示文稿。从数据库中选择时,请应用以下格式:

select to_char(sysdate, 'YYYY-MM-DD') from dual;

要默认使用此格式,请在会话的NLS_DATE_FORMAT参数中设置:

alter session set NLS_DATE_FORMAT = 'YYYY-MM-DD';

您还可以设置NLS_TIMESTAMP_FORMATNLS_TIMESTAMP_TZ_FORMAT。请参阅Oracle文档中的Setting Up a Globalization Support Environment

关于时区,通常是应用程序在数据库中插入timestamp with time zone来选择它所放置的时区。但是查询这些时间戳的应用程序可以请求将它们返回到另一个时区。比较以下查询:

select systimestamp from dual; -- This gives you the timestamp in the server configured time zone
select systimestamp at time zone 'EST' from dual; -- This is in your EST time zone
select systimestamp at time zone '+00:00' from dual; -- Finally the same timestamp in UTC.

要强制某个时区,您可以使用after insert or update触发器强制它。类似的东西:

create or replace trigger my_table_force_utc_timestamps
before insert or update on my_table
for each row
begin
    :new.my_timestamp_with_tz := :new.my_timestamp_with_tz at time zone '+00:00';
end;
/

如果确实想将您的时间戳转换为UTC,您可以尝试:

update my_table set my_timestamp_with_tz = my_timestamp_with_tz at time zone '+00:00';

编辑:要在插入表格之前更改sysdate时区,您实际上必须使用systimestamp at time zone …来投射到日期值:

insert into my_table (date_column) values (systimestamp at time zone '+00:00');

您可以在Oracle文档Datetime and Time Zone Parameters and Environment Variables中阅读有关时区的更多信息。使用示例table_dt,这将给出:

SQL> ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS';

Session modifiee.

SQL> CREATE TABLE table_dt (c_id NUMBER, c_dt DATE);

Table creee.

SQL> insert into table_dt values (1, systimestamp);

1 ligne creee.

SQL> insert into table_dt values (2, systimestamp at time zone '+00:00');

1 ligne creee.

SQL> select * from table_dt;

      C_ID C_DT
---------- ----------------------
         1 13-JANV.-2013 16:31:41
         2 13-JANV.-2013 15:32:08

答案 1 :(得分:1)

您可以使用new_time oracle功能

SELECT to_char(new_time(to_date('01-03-2013','mm-dd-yyyy HH24:MI'), 
                        'EST', 'GMT'),'yyyy-mm-dd HH24:MI') d
FROM DUAL;

使用它来测试您的数据库:

SELECT to_char(new_time(sysdate, 'EST', 'GMT'),'yyyy-mm-dd HH24:MI') d
FROM DUAL;