ksh 분기 시작 및 종료 날짜 가져오기

ksh 분기 시작 및 종료 날짜 가져오기

현재 날짜로부터 분기의 첫 번째 날과 마지막 날을 계산해야 하는 쉘 스크립트를 작성 중입니다. 이는 스크립트 내에서 트리거되는 Ingres 10 SQL 문에 적용됩니다. Ingres는 ksh를 사용하여 Solaris 서버에서 실행됩니다.

그래서 오늘이 2017년 1월 31일이라면 다음과 같이 계산하고 싶습니다.

  1. 이번 분기의 첫 번째 날짜(2017년 1월 1일)
  2. 이번 분기의 마지막 날짜(2017년 3월 31일)입니다. 필요한 경우 독점 날짜를 여기에 반환할 수 있습니다(예: 01/04/17).
  3. 직전 분기의 첫 번째 날짜(01/10/16)
  4. 이전 분기의 마지막 날짜(2016년 12월 31일)입니다. 2017년 1월 1일의 독점 결과도 제공됩니다.

누구든지 도와줄 수 있나요? 분기 번호를 얻는 것과 관련된 문제를 본 적이 있지만 실제로는 도움이 되지 않습니다.

다음을 시도했지만 변수가 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"

나는 다음과 같은 결과를 얻습니다.

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 =

답변1

사용 ksh93( /bin/shSolaris 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"

예:

$ ./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

다음과 같은 방법을 사용하십시오.

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

그럼에도 불구하고 Bourne과 유사한 쉘에서 변수 할당을 위한 구문은 다음과 같습니다.

var=value

양쪽에 공백이 없습니다 =.

관련 정보