calculate 13 months ago

hi,
I have a big file that contains datas since 4 years ago.

I need re-create this file but just lines that are 13 months ago from today.

see what I have: ( I have a file.ksh that calls this file.scl ok !!)

======== file.scl ================
/STATISTICS=stderr
/STABLE
/NODUPLICATES
/EXECUTE " today=`date +%Y%m%d` "
/EXECUTE " 13m_ago=`expr ${today} - 10000` "
/INFILE=$PAR_SCL1
/FIELD=(CONTA_CORRENTE, POSITION=1, SIZE=13)
/FIELD=(DATA_VENCIMENTO, POSITION=50, SIZE=10)
/CONDITION=(cond1, TEST=(DATA_VENCIMENTO > ($13m_ago) )
/INCLUDE=(CONDITION=cond1)
/KEY=(NUMERO_FATURA, ASCENDING)
/OUTFILE=$PAR_SCL2
/FIELD=(CONTA_CORRENTE, POSITION=1, SIZE=13)
/FIELD=(DATA_VENCIMENTO, POSITION=50, SIZE=10)

============================================

"DATA_VENCIMENTO" is the date that have to be in the maximum equal 13 months ago.
the layout of DATA_VENCIMENTO is 20071115 , for exemple.

I've already see the topic ( http://www.unix.com/answers-frequently-asked-questions/13785-yesterdays-date-date-arithmetic.html\) but it didn't help me ...

My Unix is Solaris.

does somebody can help ?
thanks , Andrea. [ 16/11/2007 ]

It's a bit ugly but:

sh/bash/ksh etc

month=`date +%m`
day=`date +%M`
year=`date +%Y`

count=13

while [ $count -gt 0 ]
do
    count=`expr $count - 1`
    month=`expr $month - 1`
    if [ $month -lt 1 ]
    then
        month=12
        year=`expr $year -1`
    fi
done

compare_date="${year}${month}${day}"

while <***read the file***>
do
    if [ $DATA_VENCIMENTO -lt $compare_date ]
    then
        <***do stuff***>
    fi
done

Umm... that could return an invalid date when run at the end of a "long" month. For example, run date is 20071231, code returns 20061131 :frowning:

hi, thanks 4 the answers, but I could resolve in a better simple way :

in my main program I did :
.
.
.
hoje=`date +%Y%m%d`
data_13m=`expr ${hoje} - 10200`

export PAR_SCL3=${data_13m}

EXECUTA "sortcl /sp=${DIR_PROG_SCL}/saida_13meses.scl" \

and in the saida_13meses.scl I did :

/EXECUTE "$PAR_SCL3"
/INFILE=$PAR_SCL1
/FIELD=(CONTA_CORRENTE, POSITION=1, SIZE=13)
/FIELD=(NUMERO_FATURA, POSITION=14, SIZE=14)
/FIELD=(DATA_VENCIMENTO, POSITION=50, SIZE=10)
/CONDITION=(cond1, TEST=(DATA_VENCIMENTO > $PAR_SCL3 ))
/INCLUDE=(CONDITION=cond1)

bye
:slight_smile:

That shouldn't matter though, we don't want to know a nice calander date 13 months ago, we want to find stuff older than that to flag.