Is it possible to express 2 week periods as a CRON expression as implemented by Quartz? - cron

Starting from the Jan 1st 2014 the 2 week periods yield the following schedule:
Jan 14
Jan 28
Feb 11
Feb 25
Mar 11
Mar 25
Apr 8
Apr 22
May 6
May 20
etc ...
This is not an idle question. Some companies have exactly 2 week long pay periods, meaning they have 26 pay periods per year rather than 24 for a company that pays twice a month as opposed to every two weeks exactly. I want to know whether I can express the pay schedule of such a company using a CRON expression.
Finally, it is possible that no CRON expression can be used to express what I want, but the Quartz scheduler may have some tricky solution that can ultimately produce the needed schedule. Note, that I can always create a calendar scheduler with 26 explicit triggers - one per pay period. I am not talking about this kind of solution.
I am using the .NET port of the Quartz library.
EDIT
An equally good schedule would be exactly every other Sunday. Note, it is not equivalent to every 2nd and 4th Sunday. Indeed, if a month has 5 Sundays, then the first schedule may result in three instances for that particular month, if started from the first Sunday. Whereas the second schedule always yields exactly two instances per month.
I have a feeling such schedules cannot be expressed in CRON, because they carry over from month to month, whereas CRON resets its month trigger each time a new month starts.
EDIT2
I guess what I am looking for could be expressed by an imaginary DayOfYear CRON field. Helas, no such thing exists. But then again, I could be wrong.

If you're using version 2.0 then you can use the CalendarIntervalTrigger, set the RepeatIntervalUnit to weeks and the RepeatInteval to 2 so that it fires every 2 weeks.

Related

Bigquery Custom Schedule Cron Syntax Not Accepted

I am trying to schedule a query to run intraday in Bigquery UI. According to Google's documentation this option uses cron syntax. I have used crontab guru to verify the syntax is correct, although it doesn't matter what syntax you put the scheduler doesn't seem to accept any. Is this a known bug? Below is the cron syntax I'm using to run every 6 hours.
0 */6 * * *
This post attempts to give a more general answer for those that may follow with similar questions.
A full description of the allowed syntax can be found directly here as well as related materials here under "schedule" field information..
For full disclosure, I'm going to lift out some parts directly from that documentation here so this answer can "stand alone".
Generally, the schedule must be of the form:
[TYPE] [INTERVAL_VALUE] [INTERVAL_SCOPE]
and you must decide which of the three different kinds of intervals you will use:
End-time intervals
Start-time intervals
Custom intervals
The kind of interval is chosen implicitly by the schedule you provide.
End-Time Intervals
These are intervals implemented from when a job finishes.
TYPE
Daily intervals must start with the "every" prefix
INTERVAL_VALUE
Valid units of time are as follows:
minutes or mins
hours
INTERVAL_SCOPE
Not applicable for end-time intervals.
Example
If "every 5 mins", and the job finishes at 0201, then then next job waits 5 minutes AFTER completion to begin again, and starts at 0206.
Start-Time Intervals
A strict schedule for the queries to follow.
TYPE
Daily intervals must start with the "every" prefix
INTERVAL_VALUE
Some integer amount of the following units of time:
minutes or mins
hours
The units remain the same even using 1 as the amount.
INTERVAL_SCOPE
Must be of the form:
from [HH:MM] to [HH:MM] with HH=00,01,...,23 and MM=00,01,..., 59.
OR
synchronized
synchronized repeats a time interval and spreads it evenly across the 24 hour period (e.g. like end-time scheduling but fixing it to a start-time).
The [INTERVAL_VALUE] given in conjunction with this option must be a factor of 24 (1, 2, 3, 4, 6, 8, 12, or 24), presumably so that each day has the same schedule (otherwise, you would get a "spill" over into the next day).
Examples
Example 1: every 5 minutes from 10:00 to 14:00
If the job starts at 1000, and takes 6 minutes, then it will run 1000, 1010, 1020, ..., because the 1005,1015, ..., jobs were skipped because they were still running.
Direct quote:
Because the start time of a job is strict, if an instance of a job
runs longer than the defined time interval, then the Cron service can
skip a job. An individual start time in the interval can be skipped if
the prior job has not completed or times out.
Example 2: every 2 hours synchronized
Runs 0000,0200,0400, ..., 2200.
Custom Intervals
These specify intervals on the day or month level, and cannot specify sub-daily intervals.
TYPE
Using every specifies a repeating interval:
every day 06:00
every monday
every tuesday
...
every sunday
Specific days can be specified with ordinal numbers (1st, 2nd, 3rd, OR, first, second, third, ..., up to 31st OR thirtyfirst)
1st,3rd tuesday
2nd, third wednesday of month 09:00
Note that the ordinal number and words can be mixed.
INTERVAL_VALUE
Valid days are any mix of the following:
monday or mon
tuesday or tue
wednesday or wed
thursday or thu
friday or fri
saturday or sat
sunday or sun
day for all days of the week
INTERVAL_SCOPE
Can include
of month [HH:MM]
of jan,feb,sep,nov [HH:MM] i.e. a comma-separated list of months
Note, a time must be given with any given month, with HH and MM given as above (00-23 and 00-59, respectively). If "of" is excluded, the job runs every month.
Allowed values:
january or jan
february or feb
march or mar
april or apr
may
june or jun
july or jul
august or aug
september or sep
october or oct
november or nov
december or dec
month for all months in the year
Examples
2nd monday,thu
1,8,15,22 of month 09:00
1st mon,wednesday,thu of sep,oct,nov 17:00
Note, there is no documentation that could be found describing the time a job runs when the time is not explicitly specified (e.g. 2nd monday,thu).
General Examples
second monday,thu -> "Custom Interval"
third, twentysecond, 30th mon -> "Custom Interval"
1 of jan,april,july,oct 00:00 -> "Custom Interval"
1st monday of sep,oct,nov 09:00 -> "Custom Interval"
1st,third monday of month 04:00 -> "Custom Interval"
1,8,15,22 of month 09:00 -> "Custom Interval"
every monday 09:00 -> "Custom Interval"
every 5 minutes from 10:00 to 14:00 -> "Start-time Interval"
every 1 hours from 08:00 to 16:00 -> "Start-time Interval"
every 2 hours synchronized -> "Start-time Interval"
every 5 minutes -> "End-time Interval"
every 1 hours -> "End-time Interval"
IMPORTANT:
Interval types are chosen implicitly when you enter the schedule
You can't mix and match the options for the different interval types.
All specified times are UTC
As said in the intro above, this information is essentially ripped from the existing documentation, but I felt that was buried away and that this question deserved a "stand alone" reference text.
Form the official documentation:
When selecting Custom, a Cron-like time specification is expected, for
example every 3 hours. The shortest allowed period is fifteen minutes.
See the schedule field under TransferConfig for additional valid API
values.
The expected format is "Cron-like" but not pure Cron. Replace your Cron syntax with every 6 hours and this will work (note that this is UTC time), see example below:

cron expression every 2 days not making sense for monday

i have a cron expression-
0 0 12 */2 * ?
If start date is monday and time is 11:40 am, the next trigger date i'm expecting is monday 12:00, followed by wednesday, friday,etc.
But when i give this expression, the first trigger is set to tuesday 12:00, followed by thursday, saturday,etc
i verified this on http://cronmaker.com
Why does this behavior occur for monday?
If the start date is set to any other day it seems to behave the way its supposed to.
So if it was set on Tuesday 11:50 am , the first trigger is on tuesday 12:00.
Please help me understand. Is it a bug or expected behavior? Is there a work around to make it trigger on monday?
Thanks
Your cron schedule doesn't care about the day of the week. It is running simply on every uneven day of the month. This is the expected behaviour.
If you need it to run on Mondays, you should use something like 0 0 12 ? * MON,WED,FRI
First of all you expression only uses ? for the day of the week, so effectively you are not controlling that part.
Second the / character in a Cron expression indicates an increment. And when used next to a *, the star just means the lower bound for that value, 1 for the day of the month.
So indeed you are asking for a fire at noon every uneven day of the month. And the start time of the trigger will only constrain the first instance to be the next uneven day of the month.
You cannot express what you seem to desire with a cron trigger - that is a schedule which is based off the start time of the trigger. You should use s SimpleTrigger for this

cron expression for quartz to start on particular month and repeat every months onwards

I am working on Quartz Scheduler where need to trigger my job on basis of monthly where user can select desired month date from which he want to make it run for every month on that particular date. lets say- I want to schedule quartz job from August 20,2015 which should run every month on 20th, but it should not start by today,must be start on August 20,2015 onward. what would be the cron expression for this?
I have tried a lot to find out the matching thread but did not worked for me.
like if i have to make for every month which start on 20 May 2015 and repeat every 20th date of month the cron expression would be [0 0 12 20 1/1 ? *].for this requirement lot of things available around and works nicely. but how to schedule Quartz which must fire on particular date and repeat onward for every month on that particular date and time?
Please help me out.any link or any guideline would be appreciable.

Schedule cron job to run on daylight savings time

I have a requirement to run one or two cron jobs (if one is not enough) for the day light savings every year. The script should be executed every year at below timings.
1) 2:00 am on second sunday of march.
2) 2:00 am first sunday of november.
I could make it to run every sunday of a month, is there a way to make it work for a specific day like this?
No, crontab has no syntax for this.
What you can do is schedule a job to run every Sunday, and make the invoked command a script that bails out immediately if it's not currently in a daylight saving (not "savings") time transition.
This assumes that the system in question is going to be up and running during the transition. If there's a power failure, or if somebody shuts the system down over the weekend, you'll probably need to make arrangements to run the missed job later. (anacron does this, but I haven't used it.)
Daylight saving time transitions occur as time is approaching the reference time.
In March, it ticks 1:59:59 to 3:00. The local clock never actually hits 2:00. So it's not actually possible to schedule for this time. You can schedule for it to run a second early, but not at the actual moment.
Likewise, in November, the clock goes from 1:59:59 to 1:00. By the time 2:00 occurs, the transition has been over for an hour. But if you schedule for 1:59:59, it will run twice.
The above (and your question) assumes North American DST rules. Other time zones transition at different dates and times, or not at all.
See also the dst tag wiki.
In North America, DST changes occur on 2nd Sunday of March, and 1st Sunday of November. The following cron entries would run on these speficic dates:
this happens at 1:59 2nd Sunday of March
59 1 8-14 3 0 echo "One minute before setting DST"
this happens at 1:59 AM 1st Sunday of November
59 1 1-7 11 0 echo "One minute before clearing DST"

Run cron job every 2 days on specified hour

How can I run a cronjob for every 2 days on a specified hour like 4:10 AM?
Is the following expression right?
10 04 * * */2 MY-COMMAND
No, you are running on days of the week which are evenly divisible by two. So you are running it on Sun, Tue, Thu, Sat; Sun, Tue, ... (This field is zero-based.)
If you move the */2 to the month field instead (fourth field), you get the same problem with uneven periodicity in months with an uneven number of days, but the aberrant days will happen only seven times a year (eight in leap years) instead of every week.
If you absolutely require the job to run every other day, you need some kind of external logic. Maybe make the script check a run file, and abort if it's less than 25 hours old (or maybe 26 if you change the system time for daylight saving time) and otherwise proceed and update the time stamp of the run file.
If you look at the job execution days you can find that it also depends on the month that you are using (ex) if you are trying to execute every 5 day then the job will be start and it will try to split the month in equal halfs (which is not) and thus it wont work as expected seeClick Here to check so it becomes mandatory to use the withIntervalInHours(intervalInHours) to get our case working

Resources