/ / Cómo convertir una zona horaria de columna de CET a CST en consulta SQL - sql, oracle

Cómo convertir una zona horaria de una columna de CET a CST en una consulta SQL - sql, oracle

Aquí estoy tratando de convertir el valor de la columna de fecha de CET a CST. Traté de usar NEW_TIME(SYSDATE ,"CET","CST") función, pero está dando un error que dice zona horaria desconocida. El problema aquí es CET Oracle no lo reconoce como zona horaria válida.

Intenté usar el enfoque "en la zona horaria" inicialmente, pero está insertando el nombre de la zona horaria en el valor de la columna, lo que no quiero.

Respuestas

0 para la respuesta № 1

Las zonas horarias de tres caracteres no se ajustan parahorario de verano. Para hacerlo, debe usar el nombre de zona horaria completamente especificado. Para ilustrar, en Canadá, hay un horario estándar central, pero la provincia de Saskatechewan no utiliza el horario de verano, por lo que si quiero convertirme ahora a la hora local en verano, donde el horario de verano está en juego, y conocer la zona horaria correcta completamente especificada nombres en el archivo DB Timezone (puede consultar la lista instalada en su DB seleccionando * de V $ TIMEZONE_NAMES;):

SELECT "Central" locale
, extract(timezone_abbr from cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Canada/Central") tz_abbrv
, CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Canada/Central" as timestamp) local_time from dual
union all
SELECT "Saskatchewan" locale
, extract(timezone_abbr from cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Canada/Saskatchewan") tz_abbrv
, CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Canada/Saskatchewan" as timestamp) local_time from dual;

LOCALE       TZ_ABBRV   LOCAL_TIME
Central      CDT        03/08/2016 9:57:24.000000 AM
Saskatchewan CST        03/08/2016 8:57:24.000000 AM

De lo contrario, necesitaría codificar cuándo cambiarentre CST y DST en sus cálculos, teniendo en cuenta que las reglas para cuándo comienza y termina el horario de verano han cambiado con el tiempo y pueden volver a cambiar en el futuro.

Entonces responda a su comentario sobre los insertos, ustedprimero debe asegurarse de que la columna esté definida para incluir la zona horaria (tipo de datos "marca de tiempo con zona horaria") y cambiar CAST de "marca de tiempo" a "marca de tiempo con zona horaria" para asegurarse de que la información de la zona esté almacenada:

p.ej.)

create table mbt (stz timestamp with time zone)

insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Indian/Maldives" as timestamp with time zone) )

insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Canada/Eastern" as timestamp with time zone) )

commit;

select * from mbt;

STZ
05/08/2016 8:06:49.000000 PM +05:00
05/08/2016 11:06:50.000000 AM -04:00

Si no incluye la zona horaria conaún debe obtener el valor modificado, pero no podrá traducir fácilmente de la hora local a una zona horaria diferente, ya que se supondrá que los valores están en la zona horaria del servidor:

drop table mbt;

create table mbt (stz timestamp);

insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Indian/Maldives" as timestamp) );

insert into mbt values (CAST(cast(add_months(sysdate,6) as timestamp) AT TIME ZONE "Canada/Eastern" as timestamp ) );

commit;

select * from mbt;


STZ
-------------------------------
05-AUG-16 08.13.16.000000 PM
05-AUG-16 11.13.16.000000 AM

0 para la respuesta № 2

Para eliminar la zona horaria, puede usar cast(.... as Timesamp). Mira mi ejemplo.

select cast( current_timestamp at time zone "CST" as timestamp), cast( current_timestamp at time zone "CST" as timestamp with time zone) from dual;