Visit Our UNIX and Linux User Community


Shell Script to Loop through Quarter dates


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Shell Script to Loop through Quarter dates
# 1  
Old 08-21-2017
Shell Script to Loop through Quarter dates

Hi,

Trying to automate a Postgres query using Shell script

Every month 1st week has to run a Monthly Queries to generate delimited files.

July 1st start of fiscal yr which has 4 Quarters until next June 30th

Example

If I'm running on Sept 5th it has to generate one file(Becuase it falls under first Quarter), dates should be between 2017-07-01 and 2017-08-31 to Postgres SQL as Input.
  • July - Sept (1 file)
  • Oct - Dec (2 files which should generate above file too)
  • Jan - Mar (3 files)
  • April - Jun (4 files)

Another Example
If I ran the script on Nov 5th, then it has to get me 2 sets of files
  • One from July 1st to Sept 30th
  • 2nd file from Oct 1st to Oct 31st

Code:
quarter_start_date=$(date +"%m %Y" | awk '{printf("%d-%02d-01\n", $2, int(($1 - 1) / 3) * 3 + 1)}')
echo $quarter_start_date
quarter_end_date=$(date '+%Y-%m-%d' -d "-$(date +%d) days")
echo $quarter_end_date
fiscal_year=$(date -d "+1 Year" "+%Y")
echo $fiscal_year
mon=$(date +'%m')
if [ $mon -ge 7 -a $mon -le 9 ]; then
     qtr=1
elif [ $mon -ge 10 -a $mon -le 12 ]; then
     qtr=2
elif [ $mon -ge 1 -a $mon -le 3 ]; then
     qtr=3
elif [ $mon -ge 4 -a $mon -le 6 ]; then
     qtr=4
fi
echo $qtr


Last edited by rbatte1; 08-22-2017 at 06:52 AM.. Reason: Added bullet lists
# 2  
Old 08-22-2017
I would be inclined to create a data file rather than a lot of arithmetic.
Code:
1 20170701 20170930
2 20171001 20171231
3 20180101 20180331
4 20180401 20180630

Then you read this file for the number of quarters you are reporting. This is also way easier to modify if the company gets sold and changes its year end.

---------- Post updated 08-22-17 at 10:19 AM ---------- Previous update was 08-21-17 at 10:51 PM ----------

Code:
today=$(date +%Y%m%d)
while read quarter start end
do
if [ $start -ge $today ]
then
   exit
fi
if [ $today -gt $end ]
then
  let new_end=$today-$(date +%d)+1        #first day of month
  let new_end=$(date +%Y%m%d --date="$new_end yesterday")   #last day of previous month
fi
if [ $new_end -le $start ]
then
   exit  
else 
   end=$new_end
fi
do sql with $quarter $start $end
done <quarter_file

# 3  
Old 08-23-2017
Quote:
Originally Posted by krux_rap
...
...
Example

If I'm running on Sept 5th it has to generate one file(Becuase it falls under first Quarter), dates should be between 2017-07-01 and 2017-08-31 to Postgres SQL as Input.
  • July - Sept (1 file)
  • Oct - Dec (2 files which should generate above file too)
  • Jan - Mar (3 files)
  • April - Jun (4 files)

Another Example
If I ran the script on Nov 5th, then it has to get me 2 sets of files
  • One from July 1st to Sept 30th
  • 2nd file from Oct 1st to Oct 31st
...
...
What should be in the files if the end of previous month is also the end of previous quarter?

For example, if the process is run on 4-Oct-2017, then:
1) "File 1" has dates of Quarter 1 i.e. 01-Jul-2017 to 30-Sep-2017
2) What dates does "File 2" have?

A few similar cases are below:

Process Date: 05-Jan-2018
File 1 : Dates of Quarter 1 i.e. 01-Jul-2017 to 30-Sep-2017
File 2 : Dates of Quarter 2 i.e. 01-Oct-2017 to 31-Dec-2017
File 3 : What dates does this have?

Process Date: 05-Apr-2018
File 1 : Dates of Quarter 1 i.e. 01-Jul-2017 to 30-Sep-2017
File 2 : Dates of Quarter 2 i.e. 01-Oct-2017 to 31-Dec-2017
File 3 : Dates of Quarter 3 i.e. 01-Jan-2018 to 31-Mar-2018
File 4 : What dates does this have?

Also, what dates should be in the file(s) if the process is run in July of any year?
# 4  
Old 08-23-2017
For example, if the process is run on 4-Oct-2017, then:
1) "File 1" has dates of Quarter 1 i.e. 01-Jul-2017 to 30-Sep-2017
2) What dates does "File 2" have?
We will be generating only 1 quarter file.

A few similar cases are below:

Process Date: 05-Jan-2018
File 1 : Dates of Quarter 1 i.e. 01-Jul-2017 to 30-Sep-2017
File 2 : Dates of Quarter 2 i.e. 01-Oct-2017 to 31-Dec-2017
File 3 : What dates does this have?
We will be generating only 2 quarter files. NO Jan Data

Process Date: 05-Apr-2018
File 1 : Dates of Quarter 1 i.e. 01-Jul-2017 to 30-Sep-2017
File 2 : Dates of Quarter 2 i.e. 01-Oct-2017 to 31-Dec-2017
File 3 : Dates of Quarter 3 i.e. 01-Jan-2018 to 31-Mar-2018
File 4 : What dates does this have?
3 quarters only

Also, what dates should be in the file(s) if the process is run in July of any year?
Generate All 4 quarters files. Because data is not complete yet in July. For that reason, we don't generate data for the month which we are running the script

But script will be running every month 1st week. So most of the time the previous month may not be the end of Quarter. So we have to consider following example also

For example, if the process is run on 4-Sept-2017, then:
Only One file has dates of Quarter 1 i.e. 01-Jul-2017 to 31-Aug-201


Let me know if anything is unclear and thanks for the follow-up questions

---------- Post updated at 02:29 PM ---------- Previous update was at 02:28 PM ----------

Thanks, JGT. the script is not working but i will use that as the base to cover all scenarios.

Quote:
Originally Posted by jgt
I would be inclined to create a data file rather than a lot of arithmetic.
Code:
1 20170701 20170930
2 20171001 20171231
3 20180101 20180331
4 20180401 20180630

Then you read this file for the number of quarters you are reporting. This is also way easier to modify if the company gets sold and changes its year end.

---------- Post updated 08-22-17 at 10:19 AM ---------- Previous update was 08-21-17 at 10:51 PM ----------

Code:
today=$(date +%Y%m%d)
while read quarter start end
do
if [ $start -ge $today ]
then
   exit
fi
if [ $today -gt $end ]
then
  let new_end=$today-$(date +%d)+1        #first day of month
  let new_end=$(date +%Y%m%d --date="$new_end yesterday")   #last day of previous month
fi
if [ $new_end -le $start ]
then
   exit  
else 
   end=$new_end
fi
do sql with $quarter $start $end
done <quarter_file

# 5  
Old 08-23-2017
Try this function with variable "start of fiscal year" in the first argument, the quarter in the second:
Code:
QUARTER()       { TMP=$(($1 %10000/100+($2 -1)*3))
                  printf "%d %d " $2 $(( ($1 /10000+TMP/12) * 10000 + TMP%12 *100 + $1 %100))
                  date -d"$(( ($1 /10000+(TMP+3)/12) * 10000 + (TMP+3)%12 *100 + $1 %100)) -1day" +"%Y%m%d"
                }
for Q in 1 2 3 4; do QUARTER 20170701 $Q; done
1 20170701 20170930
2 20171001 20171231
3 20180101 20180331
4 20180401 20180630


Last edited by RudiC; 08-23-2017 at 05:50 PM..
This User Gave Thanks to RudiC For This Post:
# 6  
Old 08-23-2017
Would this come close to what you need:
Code:
for X in 20170805 20170830 20170915 20171005 20171112 20180522
   do   END=$(date +"%Y%m%d" -d"$X - $(date +"%d" -d$X) days")
        for Q in 1 2 3 4
          do    read _ QSTART QEND <<< $(QUARTER 20170701 $Q)
                printf "$X:  sqlplus $USER%%$PASSWD %d %d " $Q $QSTART
                [ "$END" -gt "$QEND" ]  &&      printf "%d\n" $QEND \
                                        ||      { printf "%d\n" $END
                                                  break 
                                                }
          done
   done
20170805:  sqlplus user% 1 20170701 20170731
20170830:  sqlplus user% 1 20170701 20170731
20170915:  sqlplus user% 1 20170701 20170831
20171005:  sqlplus user% 1 20170701 20170930
20171112:  sqlplus user% 1 20170701 20170930
20171112:  sqlplus user% 2 20171001 20171031
20180522:  sqlplus user% 1 20170701 20170930
20180522:  sqlplus user% 2 20171001 20171231
20180522:  sqlplus user% 3 20180101 20180331
20180522:  sqlplus user% 4 20180401 20180430


Last edited by RudiC; 08-25-2017 at 05:07 PM..
This User Gave Thanks to RudiC For This Post:
# 7  
Old 08-23-2017
I noticed a slight error in my original script.
Code:
today=$(date +%Y%m%d) 
while read quarter start end
do if [ $start -ge $today ] 
then
    exit
 fi 
if [ $today -gt $end ]
 then 
  let new_end=$today-$(date +%d)+1        #first day of month
   let new_end=$(date +%Y%m%d --date="$new_end yesterday")   #last day of previous month
 #fi
 if [ $new_end -le $start ] 
then
    exit
   else
     end=$new_end 
fi
fi
 do sql with $quarter $start $end done <quarter_file

Also if you need to re-run an old report, just force a value for 'today'.
I would presume that if you run the report in July, you are expecting 4 quarterly reports for the previous fiscal year.
This User Gave Thanks to jgt For This Post:

Previous Thread | Next Thread
Test Your Knowledge in Computers #411
Difficulty: Medium
Aside from its AT&T UNIX base, XENIX incorporated elements from BSD, notably the vi text editor and its supporting libraries (termcap and curses).
True or False?

10 More Discussions You Might Find Interesting

1. Linux

How to calculate the quarter end date according to the current date in shell script?

Hi, My question is how to calculate the quarter end date according to the current date in shell script? (2 Replies)
Discussion started by: Divya_1234
2 Replies

2. Shell Programming and Scripting

Comparing dates in shell script

Hi All, I have a date variable say dt="2014-01-06 07:18:38" Now i need to use this variable to search a log and get the entries which occured after that time. (1 Reply)
Discussion started by: Girish19
1 Replies

3. Shell Programming and Scripting

Shell script to work on dates

Hi Sir/Madam I have a file data.txt like below file_name date_of_creation x 2/10/2012 y 8/11/2010 z 11/3/2013 a 2/10/2013 b 3/10/2013 c ... (4 Replies)
Discussion started by: kumar85shiv
4 Replies

4. Shell Programming and Scripting

Need Help:Shell Script for Solaris to change the dates in a file by one week

I have to increase the date by one week in an input when script is executed in solaris. I was able to acheive this using ksh script that is working in Linux enivironment, when i execute the same script in Solaris i am getting below error: /var/tmp\n\r-> ./script.ksh date: illegal option -- d... (3 Replies)
Discussion started by: sriramanaramoju
3 Replies

5. Shell Programming and Scripting

Shell script to calculate difference between 2 dates

shell script to calculate difference between 2 dates (3 Replies)
Discussion started by: gredpurushottam
3 Replies

6. Shell Programming and Scripting

append dates going forward from today to certain line in shell script

Hi there, I have a requirement to append dates going forward to a certain line in a file. I'm not sure of how to go about this. Any help will be greatly appreciated. Thanks Slyesco:wall: (2 Replies)
Discussion started by: Slyesco
2 Replies

7. UNIX for Dummies Questions & Answers

Find Quarter Start and End Dates

Dear Members, Depending on the current date i should find out the start and end dates of the quarter. ex: Today date is 14-Nov-2011 then Quarter start date should be Oct 1 2011 and Quarter End date should be Dec 31 2011. How can i do this? Thanks Sandeep (1 Reply)
Discussion started by: sandeep_1105
1 Replies

8. Shell Programming and Scripting

Difference of 2 dates in shell script

Hi., After retrieving values from DB I have two datestamps in format: 12/01/2010:05:40:00 AM and 12/01/2010:06:00:00 PM. general time format: MM/DD/YYYY:HH:MM:SS AM or PM Any quick solution to get the difference of two in the format : 1 day(s) 12:20:00 Thanks., (6 Replies)
Discussion started by: IND123
6 Replies

9. Shell Programming and Scripting

Generate quarter dates with begin date and end date

Hi All, I am trying to generate quarter dates with user giving input as begin date and end date. Example: Input by user: begin_date = "2009-01-01" end_date = 2010-04-30" required output: 2009-01-01 2009-03-31 09Q01 2009-04-01 2009-06-30 09Q02 . . till 2010-01-01 2010-03-31 10Q01 ... (9 Replies)
Discussion started by: sol_nov
9 Replies

10. Shell Programming and Scripting

How to compare the dates in shell script

Hi How to compare created or modified date of two files help needed thanks Vajiramani :) (9 Replies)
Discussion started by: vaji
9 Replies

Featured Tech Videos