¿Se puede usar sed para generar un archivo de carga para mi tabla de hechos de búsqueda de fechas?

¿Se puede usar sed para generar un archivo de carga para mi tabla de hechos de búsqueda de fechas?

Tengo una tabla de hechos SQL que se utiliza para buscar una fecha y devolver otra fecha.

El esquema de la tabla es el siguiente:

TABLE date_lookup
   (
pk_date DATE,
plus1_months DATE,
plus2_months DATE,
plus3_months DATE
   );

UNIQUE INDEX on date_lookup(pk_date);

Tengo un archivo de carga (delimitado por tuberías) que contiene fechas del 28/01/2012 al 31/03/2014.

El siguiente es un ejemplo del archivo de carga:

01-28-2012|02-28-2012|03-28-2012|04-28-2012|

01-29-2012|02-29-2012|03-29-2012|04-29-2012|

01-30-2012|02-29-2012|03-30-2012|04-30-2012|

01-31-2012|02-29-2012|03-31-2012|04-30-2012|

...

03-31-2014|04-30-2014|05-31-2014|06-30-2014|

Las reglas para esta tabla de hechos son:

IF pk_date has more than 28 days in its month
AND plus1, plus2 or plus3_months only has 28, 29 or 30 days
THEN let plus1, plus2 or plus3 equal the last day of the following month. 

Mi pregunta es: ¿Es posible utilizarlo sedpara generar más fechas posteriores al 31/03/2014 siguiendo las reglas anteriores para mi archivo de carga, o debería escribir un programa para lograr esto?

Respuesta1

Dudo que sedsea la herramienta adecuada para el trabajo, en este caso. Creo que probablemente quieras usarlo awk, si ya estás familiarizado con él awk; de lo contrario, escribe un programa.

Conocí a un ingeniero que usó sedy awkcreó archivos de entrada MSC/NASTRAN, que tenían requisitos aún más estrictos que los que usted menciona, pero estaba bastante familiarizado con las herramientas, por lo que los mensajes de error crípticos y poco informativos awk no le molestaban.

Si desea hacer esto con awk, mi consejo sería preprocesar la entrada para eliminar '-' y '|' caracteres. Escriba el awkprograma en un archivo separado. Utilice posiciones de campos de texto ($1, $2, $3...) y escriba declaraciones SQL INSERT para la salida. Se necesitarán varios intentos, así que automatice tanto como sea posible.

Respuesta2

Si bien es técnicamente posible realizar aritmética de fechas en sed, no es en absoluto la herramienta adecuada para el trabajo. Utilice una herramienta como awk o perl que tenga incorporada la aritmética de enteros.

Su requisito es inusual para la manipulación de fechas, por lo que necesitará una biblioteca rica de manipulación de fechas si no desea codificar la aritmética de fechas. PerlDate::Maniptiene funciones como Date_DaysInMonth.

#!/usr/bin/env perl
use strict;
use warnings;
use Date::Manip;
use List::Util qw(/./);
sub shift_month {
    my ($delta, $y, $m, $d) = @_;
    $m += $delta;
    $y += $m / 12;
    $m %= 12;
    return ($y, $m, min($d, Date_DaysInMonth($m, $y)));
}
my $next_day = ParseDateDelta("1 day");
my ($cur, $end) = (ParseDate($ARGV[0]), ParseDate($ARGV[1]));
while (Date_Cmp($cur, $end) < 0) {
    my @ymd = UnixDate($cur, qw(%Y %m %d));
    foreach my $i (0..3) {
        printf "%02d-%04d-%02d|", @{[shift_month($i, @ymd)]}[1, 0, 2];
    }
    $cur = DateCalc($cur, $next_day);
    print "\n";
}

información relacionada