Tengo una consulta de selección simple como la de abajo, pero me di cuenta de que me estoy volviendo regional veces. ¿Cómo puedo convertir de UTC en mi selecciona declaración?

select myTimeStamp, MyName, MyBranch from tableA

Resultado: ’27/03/2014 15:15:26′ ‘juan’, ‘londres’

He intentado usar sys_extract_utc (myTimeStamp), pero tengo el error

comando sql no está correctamente terminado

La columna myTimestamp es de tipo ‘date’.

Si la columna es de tipo date, ¿cómo sabe que ha ‘regional’, y cómo Oracle saber qué región/desplazamiento que representa – y entonces, ¿cómo convertir a UTC? ¿Tiene alguna otra información que identifica a la región en la que cada valor debe ser?

OriginalEl autor Fearghal | 2014-03-27

3 Comentarios

  1. 17
    select cast(mytimestamp as timestamp) at time zone 'UTC', 
           MyName, 
           MyBranch 
    from tableA

    Porque mytimestamp es en realidad un date no una marca de tiempo que necesita para lanzar. Haciendo que hace Oracle asumir que la información almacenada en mytimestamp está en la zona horaria del servidor-si no es ese el caso de que usted necesita para utilizar Madhawas’ solución.

    Gracias he probado esto, pero me dan ORA-300084 -no Válido tipo de datos de fecha de tiempo principal con la zona horaria modificador’. He comprobado de nuevo y myTimestamp ios de tipo ‘Date’.
    La solución descrita anteriormente empate de la fecha a la zona horaria. Ahora tengo que hacer una cosa más; cambiar el tiempo a ser UTC? Por ejemplo, si el tiempo es de la 1 am PDT (UTC-7horas) quiero que este momento sea 08am UTC

    OriginalEl autor a_horse_with_no_name

  2. 9

    Dependiendo del tipo, hay un par de errores con respecto a lo de la zona horaria de Oracle es la conversión de acuerdo a lo que el tipo de datos de myTimestamp es.

    marca de tiempo con la zona horaria

    Funciona™. a_horse_with_no_name tiene la respuesta correcta aquí.

    marca de tiempo con la hora local de la zona de

    es implícitamente a marca de tiempo con la zona horaria, entonces, Sólo Funciona™. De nuevo, a_horse_with_no_name está aquí.

    timestamp

    Mientras que también está implícitamente a marca de tiempo con la zona horaria, la zona horaria en la que se asigna por defecto es la sesión zona horaria (en oposición a la base de datos zona horaria).

    • Una invocación explícita de esto es myTimestamp at local.
    • Alternativamente (y probablemente mejor), usted puede hacer como Madhawas dice y el uso de la from_tz función para crear de forma explícita un valor explícito zona horaria distinta de la de su sesión.

    fecha

    Tratando de hacer cualquiera de las anteriores para fecha fallará como usted la describe:

    • myTimestamp at time zone 'UTC'

      ORA-30084: no válido tipo de datos datetime principal con la zona horaria modificador

    • from_tz(myTimestamp, 'America/New_York')
      ORA-00932: inconsistentes tipos de datos: se espera TIMESTAMP consiguió FECHA

    La solución aquí es para echar la fecha a un timestamp primero:

    select from_tz(cast(myTimestamp as timestamp), 'America/New_York') from tableA

    Script De Ejemplo

    La siguiente secuencia de comandos muestra el comportamiento. Tenga en cuenta que en mi sistema, dbtimezone es de US/Central, y sessiontimezone es GMT-05:00.

    Yo también uso to_char para convertir la salida como he encontrado algunas herramientas va a alterar el resultado de hora en formas sutiles, especialmente si ellos no tienen una buena marca de tiempo de apoyo (esto es raro hoy en día, pero todavía potencialmente un problema).

    alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS'
    /
    alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS'
    /
    alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS TZR'
    /
    
    select dbtimezone
          ,sessiontimezone
          ,to_char(timestamp '2017-01-01 06:00:00') as ts
          ,to_char(timestamp '2017-01-01 06:00:00' at local) as ts_at_local
          ,to_char(timestamp '2017-01-01 06:00:00' at time zone dbtimezone) as ts_at_db
          ,to_char(timestamp '2017-01-01 06:00:00' at time zone sessiontimezone) as ts_at_session
     from dual
    /

    La salida en mi sistema es el siguiente (a formatear como en columnas para facilitar la lectura):

    DBTIMEZONE          US/Central
    SESSIONTIMEZONE     -05:00
    TS                  2017-01-01 06:00:00
    TS_AT_LOCAL         2017-01-01 06:00:00 -05:00
    TS_AT_DB            2017-01-01 05:00:00 US/CENTRAL
    TS_AT_SESSION       2017-01-01 06:00:00 -05:00
    No sé por qué tengo un tipo de fecha que tiene tiempo en esto, pero lo hace mi siguiente pregunta es…Le echaban la fecha dateTime sobrescribir el momento en que la parte de mi variable, restablecer a 00:00:00?
    Oracle date tipo tiene un componente de tiempo, así que esto es totalmente normal. Casting para timestamp mantenga el tiempo. (Las fracciones de segundos parte será cero). Esto es fácil de probar: select cast(sysdate as timestamp) from dual.
    oh ok veo un problema, creo que me perdí describe el problema. La solución descrita anteriormente empate de la fecha a la zona horaria. Ahora tengo que hacer una cosa más; cambiar el tiempo a ser UTC? Por ejemplo, si el tiempo es de la 1 am PDT (UTC-7horas) quiero que este momento sea 08am UTC
    Sé que esto es completamente viejo, pero @cdonnellytx , ¿tiene usted una documentación de referencia para el siguiente? Mientras que también está implícitamente a timestamp con la zona horaria, la zona horaria en la que se asigna por defecto es el tiempo de la sesión de la zona (como opuesto a la base de datos de zona horaria). Yo no puedo encontrar documentos que dicen “sesión” el tiempo de la zona (y eso no es lo que estoy viendo en las pruebas, estoy viendo UTC ser utilizado)
    Gracias por la respuesta. El uso de SQL developer, independientemente de la dbtimezone, o sessiontimezone, veo los mismos valores para los datos de zonas horarias. Incluso un volcado de los datos de la columna que produce datos, que es la fecha los componentes de tiempo, completamente zona horaria independiente. He descubierto que, cuando puedo recuperar los datos de un cliente, me estoy haciendo la misma cosa, en la zona horaria de datos independientes. (Sólo una intensa en lo que yo estoy viendo para usted y cualquier persona que puede tropezar a través de esto en el futuro)

    OriginalEl autor Chris R. Donnelly

  3. 5

    Que usted necesita saber su zona horaria para este;

    SELECT myTimeStamp, from_tz(myTimeStamp, 'America/New_York') AT TIME ZONE 'UTC' utc FROM dual;
    Tendría que cast(myTimeStamp as timestamp) dentro de la from_tz llamada, ya que es un date.
    La solución descrita anteriormente empate de la fecha a la zona horaria. Ahora tengo que hacer una cosa más; cambiar el tiempo a ser UTC? Por ejemplo, si el tiempo es de la 1 am PDT (UTC-7horas) quiero que este momento sea 08am UTC
    este es el ajuste de la hora. El from_tz() es la vinculación de la fecha, la zona horaria, EST/EDT en este ejemplo, la ‘zona horaria ‘UTC” es la conversión de la hora UTC. Siempre y cuando usted sabe que la zona horaria, la fecha de origen, esto hace que lo que usted dijo que usted necesita. Esto es demasiado código para un comentario realmente, pero: select from_tz(cast(to_date('2014-03-27 01:00', 'YYYY-MM-DD HH24:MI') as timestamp), 'America/Los_Angeles') at time zone 'UTC' from dual da 27-MAR-14 08.00.00.000000 UTC. Si eso no es lo que usted significa que usted necesita para ampliar su pregunta.

    OriginalEl autor Madhawas

Dejar respuesta

Please enter your comment!
Please enter your name here