ksh obtém as datas de término do trimestre

1

Estou escrevendo um script de shell e preciso calcular o primeiro e o último dia de um trimestre a partir da data atual. Isso é para uso em instruções SQL do Ingres 10 disparadas de dentro do script. O Ingres é executado em um servidor Solaris com ksh.

Então, se hoje for 31/01/17, eu gostaria de calcular o seguinte

  1. a primeira data do trimestre atual (01/01/17)
  2. a última data do trimestre atual (31/03/17). Não há problema em retornar aqui uma exclusividade para data, se necessário (por exemplo, 01/04/17)
  3. a primeira data do trimestre anterior (01/10/16)
  4. a última data do trimestre anterior (31/12/16). Um resultado exclusivo de 01/01/17 também seria OK.

Alguém pode me ajudar? Eu vi perguntas relacionadas ao número do trimestre, mas isso não está ajudando.

Eu tentei o seguinte, mas não está funcionando, já que as variáveis não estão sendo preenchidas na declaração case

CURR_MONTH='date +%m'
echo "Current month num = $CURR_MONTH"

CURR_YEAR='date +%Y'
echo "Current year = $CURR_YEAR"

let "LAST_YEAR = $CURR_YEAR - 1"
echo "Last year = $LAST_YEAR"


case $CURR_MONTH in
05) CURR_Q_FROM = 01.04.${CURR_YEAR}
CURR_Q_TO = "30.06.${CURR_YEAR}"
PREV_Q_FROM = "01.01.${CURR_YEAR}"
PREV_Q_TO = "31.03.${CURR_YEAR}" ;;
esac

echo "Current Q From = $CURR_Q_FROM"
echo "Current Q To = $CURR_Q_TO"
echo "Prev Q From = $PREV_Q_FROM"
echo "Prev Q To = $PREV_Q_TO"

Eu recebo a seguinte saída

Current month num = 05
Current year = 2017
Last year = 2016
Month to be extracted = April 2017
./stats_report_monthly.sh[85]: CURR_Q_FROM:  not found
./stats_report_monthly.sh[86]: CURR_Q_TO:  not found
./stats_report_monthly.sh[87]: PREV_Q_FROM:  not found
./stats_report_monthly.sh[88]: PREV_Q_TO:  not found
Current Q From =
Current Q To =
Prev Q From =
Prev Q To =
    
por Ben Hamilton 05.05.2017 / 14:38

1 resposta

2

Com ksh93 (também /bin/sh no Solaris 11):

#! /usr/bin/ksh
eval "$(printf '%(y=%Y m=%-m)T')"
first=$(printf '%(%F)T' "$y-$(((m-1)/3*3+1))-1")
last=$(printf '%(%F)T' "$first next 2 months last day")
echo "$first $last"

first2=$(printf '%(%F)T' "$first last 3 months")
last2=$(printf '%(%F)T' "$first2 next 2 months last day")
echo "$first2 $last2"

Exemplo:

$ ./quarter
2017-04-01 2017-06-30
2017-01-01 2017-03-31
$ faketime 2017-01-31 ./quarter
2017-01-01 2017-03-31
2016-10-01 2016-12-31

Usando sua abordagem, isso seria:

eval "$(date +'y=%Y m=%m')"
case $m in
  (0[1-3])
     echo "$y-01-01 $y-03-31"
     echo "$((y-1))-10-01 $((y-1))-12-31";;
  (0[4-6])
     echo "$y-04-01 $y-06-30"
     echo "$y-01-01 $y-03-31";;
  (0[7-9])
     echo "$y-07-01 $y-09-30"
     echo "$y-04-01 $y-06-30";;
  (*)
     echo "$y-10-01 $y-12-31"
     echo "$y-07-01 $y-09-30"
esac

Em qualquer caso, observe que a sintaxe das atribuições de variáveis em shells semelhantes a Bourne é:

var=value

Não há espaço nos dois lados de = .

    
por 05.05.2017 / 16:13

Tags