您的位置:首页 > 运维架构 > Shell

Shell打印日期范围的列表日期

2017-04-17 11:19 477 查看
1、输入两日期参数打印两日期范围内的日期列表
printRangeDate.sh
#!/bin/bash

#
startdate="$1"
date1=$(date -d "$1" "+%s")
date2=$(date -d "$2" "+%s")
date_count=$(echo "$date2 - $date1"|bc)
day_m=$(echo "$date_count"/86400|bc)
for ((sdate=0;sdate<"$day_m";sdate++))
do
echo $(date -d "$startdate $sdate days" "+%F")
done

调试:
sh printRangeDate.sh 20180101 2018-12-31
sh printRangeDate.sh 2018-01-01 2018-12-31
sh printRangeDate.sh 20180101 20181231
参数格式的话没有影响;但第一个传进去的日期确定是起始日期,第二个传进去的日期是结束日期,且打印的日期列表不包括第二个传进去的日期。

2、打印当前日期之前一段时间内的日期列表
printNDaysAgoDate.sh
#!/bin/bash

#
count=$1
while [[ $count -ge 0 ]]
do
date +"%Y%m%d" -d"$count day ago"
count=$(($count-1))
done

调试:
sh printNDaysAgoDate.sh 30
sh printNDaysAgoDate.sh 365
只需要传入一个参数,即当前日期多少天以前。当然,可以根据需要,修改成多少天以后范围内的日期;循环的开始改成到昨天结束等。

3、项目中用到的实例
通过循环日期执行Hive库的Sql
exec_HiveSql.sh
#!/bin/bash

startdate="2017-03-10"
date1=$(date -d "2017-03-10" "+%s")
date2=$(date -d "2017-04-11" "+%s")
date_count=$(echo "$date2 - $date1"|bc)
day_m=$(echo "$date_count"/86400|bc)
for ((sdate=0;sdate<"$day_m";sdate++))
do
pt_day=$(date -d "$startdate $sdate days" "+%F")
hive -e "
ALTER TABLE xx1_anthor_live_time drop if exists PARTITION(pt_day = '$pt_day');
ALTER TABLE xx1_anthor_live_time ADD IF NOT EXISTS PARTITION(pt_day = '$pt_day');
insert overwrite table xx1_anthor_live_time partition(pt_day = '$pt_day')
select a1.roomid,count(*) anthor_live_time
from t_log_anthor_heart_beat_v4 a1
inner join xx1_romm_list a2 on a1.roomid=a2.roomid
where a1.pt_day = '$pt_day'
and a1.gameid in(1355,1388)
group by a1.roomid;"
done
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: