• Publicidad

Horario de AM/PM a formato 24 horas

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Horario de AM/PM a formato 24 horas

Notapor seafree » 2022-02-21 15:56 @706

¿Qué tal? Tengo una tabla con un campo TIMESTAMP y en ella estoy cambiando registros con horario AM y PM a formato 24 horas, estilo militar:

fecha | character(26) la fecha la importo en campo tipoi char
Ya importado los registros convierto el campo fecha a timestamp
fecha_24 | timestamp without time zone

Todo estaba funcionando bien hasta ahorita que necesito actualizar registros y no me lo permite, la tabla cuenta con los siguientes campos,

fecha | character(26) ------------> Es una fecha tipo carácter con AM Y PM "ORIGEN"
valor | numeric(6,2)
fecha_24 | [b]timestamp without time zone [/b]-> En éste campo guardo la fecha cambiada a 24 horas

Dí por hecho que se estaban realizando todas las conversiones hasta que surgió una excepción:
UPDATE t_mediciones set fecha_24='2021/01/01 24:05:11' WHERE subestacion= 'EDO ' and fecha like '01/01/2021 12:05:11 p.m.%' and valor=-218.54

Potgresql envía el siguiente mensaje:

ERROR: date/time field value out of range: "2021/01/01 24:05:11"
LINE 1: UPDATE t_mediciones set fecha_24='2021/01/01 24:05:11' WHERE.

Espero seas tan amable de brindar su ayuda porque no doy con la razón.

Respetos
seafree
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Publicidad

Re: HORARIO T

Notapor explorer » 2022-02-21 16:09 @714

Yo no veo ningún código Perl, así que no podemos decir dónde está el error.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: HORARIO T

Notapor seafree » 2022-02-22 10:35 @483

Gracias por responder, explorer. Verás, el código es el siguiente:

Extraigo los registros para cambiar los horarios de 12 horas a 24 horas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $sql_trae_fecha = "SELECT subest,trim(fecha),fecha_24,valor from t_mediciones WHERE subest=\'EDO\' and fecha_24 is null";
  2. $sth->execute();
  3. .
  4. .
  5. while (my @row=$sth->fetchrow_array){
  6.       ($sub,$dato,$f_24,$valor)=@row;
  7.         print "<b>ZONA:</b> $sub - <b>FECHA:</b> $dato - <b> FECHA_24:</b> $f_24<b>VALOR: </b>$valor <br><br>";
  8.         # RESULTADO: ZONA: EDO - FECHA: 01/01/2021 12:05:11 p.m. - FECHA_24: VALOR: -218.54
  9.         # ASIGNACIÓN A UN ARRAY
  10.         # Aplica la operación que hay a la derecha a la cadena de caracteres que está almacenada en $dato
  11.         # La operación es de búsqueda (match "m")
  12.         # Búsqueda independiente si está en mayúsculas o minúsculas = i
  13.         # Guarda lo que coincida con el patrón que está dentro de ellos
  14.         my @fecha = $dato =~ m{(\d+)/(\d+)/(\d+) (\d+):(\d+):(\d+) ([ap])[.]m[.]}i;
  15.         print "ARR_FECHA:  @fecha <br>";
  16.         # RESULTADO: ARR_FECHA: 01 01 2021 12 05 11 p
  17.         $fecha[3] += 12*(lc($fecha[-1]) eq "p");
  18.         print "FECHA3: $fecha[3]<br>";
  19.         # RESULTADO: FECHA3: 24
  20.         printf @fecha[2,1,0,3,4,5];
  21.         #printf "Resultado: %04d/%02d/%02d %02d:%02d:%02d\n", @fecha[2,1,0,3,4,5];
  22.         my $fecha_cambiada = sprintf "%04d/%02d/%02d %02d:%02d:%02d", @fecha[2,1,0,3,4,5];
  23.         print "FECHA_CAMBIADA: $fecha_cambiada";
  24.         # RESULTADO: FECHA CAMBIADA: 2021 01 01 24 05 11
  25.         exit;
  26.         ....
  27. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

El problema es que se está leyendo el siguiente campo fecha: 01/01/2021 12:05:11 p.m. y se está considerando como si fuera media noche pero no es así, se hace referencia al MEDIO DÍA.

¿QUÉ PASA EN ESTOS CASOS?

En específico, el problema existe en la existencia de registros con fecha y hora de la siguiente manera:

1) 01/01/2021 12:04:36 a.m.
2) 01/01/2021 12:05:11 p.m.

Para el caso 1, debe permanece tal cual
Para el caso 2, en lugar de generar una suma sería un resta porque tiempo de 24 Horas. Inicia en 0, por lo tanto el horario debe ser 00:05:11, ¿correcto?

Respetos
seafree
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: HORARIO T

Notapor explorer » 2022-02-22 12:56 @580

Después de la línea 17, pon esta otra, para obligar a que los valores de hora estén en el rango [0..23]:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         $fecha[3] %= 24;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De hecho, sólo es necesario hacerlo en una ocasión, que es a las 12 de la noche, así que también se puede poner así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         $fecha[3] = 0  if $fecha[3] == 24;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Horario de AM/PM a formato 24 horas

Notapor seafree » 2022-02-22 14:29 @645

Enormes gracias, explorer.

Respetos.
seafree
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados