特定の日付範囲内で毎月関数を実行する

特定の日付範囲内で毎月関数を実行する

問題:最小日付と最大日付のパラメータ(例:script.sh 20190801、20201005)を使用して、その日付範囲の毎月関数を実行します。 (例:20190801-20190831、20190901-20190931...)

バックストーリー:日付範囲内のデータに基づいてCSVを生成する機能があり、より大きな日付範囲に対して実行するのに時間がかかりすぎます。これを念頭に置いて毎月実行し、CSVを再接続してみました。 PythonやJavascriptで同様のことを試して日付/時刻ライブラリを使用しますが、一部の会社の制限ではbash / shellを排他的に使用する必要があります。

現在考えているのは次のとおりですが、ほとんど失敗します。

たとえば、次のコードに20190101 20201231を渡して予想される結果を得ましたが、20190105 20200820のようなものをサポートするように修正する方法がわかりません。

DateMin=$1
DateMax=$2

if [ $DateMin -ge $DateMax ]; then
    echo "ERROR: Minimum Date Cannot be above Maximum Date"
    exit
fi

let DateDelta=DateMax-DateMin

for YearDelta in `seq $DateDelta -10000 0`
do
    let TempDelta=$YearDelta-1130
    for MonthDelta in `seq $YearDelta -100 $TempDelta`
    do
        let TempMin=$DateMax-$MonthDelta
        let TempMax=$DateMax-$MonthDelta+30
        call_to_function $TempMin $TempMax
    done
done

見やすくするために、ここにrepl.itを作成しました。https://repl.it/repls/CanineAdmirableSeahorse#main.sh 「bash main.sh 20190101 20201231」を実行すると予想される出力です。

ベストアンサー1

このプログラムを使うのはどうですかdate?このプログラムは日付と一緒に多くを計算することができます。例は次のとおりです。

DateMinStr="${1:0:4}-${1:4:2}-01"
DateMaxStr="${2:0:4}-${2:4:2}-${2:6:2}"
DateMin=$(date -d $DateMinStr +%s)
DateMax=$(date -d $DateMaxStr +%s)

if [ $DateMin -ge $DateMax ]; then
    echo "ERROR: Minimum Date Cannot be above Maximum Date"
    exit
fi

DateCurrentStr=$DateMinStr
DateCurrent=$DateMin
while [ $DateCurrent -lt $DateMax ]
do
    TempMin=$(date -d $DateCurrentStr +%Y%m%d)
    TempMinStr=$(date -d $DateCurrentStr +%Y-%m-%d)
    TempMax=$(date -d "$TempMinStr + 1 month - 1 day" +%Y%m%d)
    TempMaxStr=$(date -d "$TempMinStr + 1 month - 1 day" +%Y-%m-%d)
    echo $TempMin $TempMax
    DateCurrent=$(date -d "$TempMaxStr + 1 day" +%s)
    DateCurrentStr=$(date -d "$TempMaxStr + 1 day" +%Y-%m-%d)
done

この例では、あなたが望むことを正確に実行するのではなく、最適化から離れていると思いますが、これを行う方法についてのアイデアを提供します。

おすすめ記事