我们有一个庞大的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
。
我们需要将表中已有的数据更改为这种新格式以及新插入的数据。
有关如何实现这一目标的任何帮助?
答案 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_FORMAT
和NLS_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;