# Understanding CRON Expressions

Many Azure resources like web jobs, Azure functions, logic apps use CRON expression when they need to work with Time Triggers. A CRON expression lets you define a time trigger with the help of **six fields**. All the possible time triggers let it be 'Once an hour' to '14 times a day' can be defined using a CRON expression.

## Understanding the expression

As mentioned earlier, a CRON expression includes six fields: 

`{second} {minute} {hour} {day} {month} {day-of-week}` 

And each field can have one of the following values:

| Type | Example | Triggered |
| --- | --- | --- |
| Specific Value | 0 5 \* \* \* \* | At every hour at that hour past 5 minutes |
| All Values (\*) | 0 \* 5 \* \* \* | At the 5th hour of day (05:mm:00), trigger it every minute of the hour | 
| A range ( - ) | 8-10 \* \* \* \* \* | At hh:mm:08,hh:mm:09,hh:mm:10 where hh:mm is every minute of every hour. 3 times a minute at 8,9,10th second | 
| A set ( , ) | 1,5,25 \* \* \* \* \* | At hh:mm:01, hh:mm:05, hh:mm:25 where hh:mm is every minute of every hour. 3 times a minute at 1, 5, 25th second | 
| An Interval ( / ) | 0 \*/5 \* \* \* \* | At hh:05:00, hh:10:00, hh:15:00 and so on till hh:55:00, hh:00:00 where hh is every hour. 12 times an hour | 

## CRON Examples

Some of the frequently used CRON expression samples

| Expression | Triggered |
| --- | --- |
| \*/10 \* \* \* \*  \* | Every 15 seconds |
| 0 \* \* \* \* \* | Every minute |
| 15 \* \* \* \* \* | Every minute at 15th Second of that minute |
| 0 \*/10 \* \* \* \* | Once every 10 minutes |
| 0 0 \* \* \* \* | Once every hour at 0th minute |
| 0 0 \*/4 \* \* \* | Once every 4 hours |
| 0 0 9-17 \* \* \* | Once every hour from 9AM to 5pm |
| 0 0 0 \* \* \* | Every day at 00:00:00 |
| 0 30 10 \* \* \* | at 10:30 am every day |
| 0 30 10 2 \* \* | at 10:30 am every 2nd day of every month |
| 0 30 10 \* \* 0,6 | at 10:30 am every weekend (Sat, Sun) |
| 0 30 10 \* \* 1-5 | at 10:30 am every weekday |
| 0 0 \* \* \* WED,FRI | Every hour on Wednesday and Friday |
| 0 0 0 \* \* SUN | Every Sunday at 00:00:00 |
| 0 0 0 1-7 \* SUN | Every first Sunday of the month at 00:00:00 |
| 0 0 0 1 \* \* | Every 1st of month at 00:00:00 |
| 0 0 0 1 1 \* | Every 1st of January every year |
| 0 0 \* \* 1 \* | Every hour in January |
| 30 5 \*/6 \* \* \* | Every 6 hours at 5 minute 30 seconds |

### Common pitfalls: 

The CRON expression **0 0 \*/5 \* \* \*** means every 5 hours. So it executes at 00:00:00, 05:00:00, 10:00:00, 15:00:00, 20:00:00, 00:00:00 ... So it's not exactly every 5 hours. If you want a regular frequency, the following  expressions are good:

-   For minutes and seconds : /2, /3, /4, /5, /6, /10, /12, /15, /20 and /30 (60 is divisible by these numbers)
-   For hours : /2, /3, /4, /6, /8 and /12
-   For Months : /2, /3, /4 and /6
-   For days : Nothing actually because there are leap years and months with 28, 29, 30 or 31 days.

If you want a cyclic approach, all other values can lead to "wrong" executions at the end of the cycle. e.g. Every 10 hours executes at 00:00:00, 10:00:00, **20:00:00, 00:00:00 (only 4 hours, not 10).** 

You can find CRON expression examples online, but many of them omit the `{second}` field. In case you copy one of them, remember to add the missing `{second}` field. Also, you will want a zero in that field and not an asterisk

## Additional references:

Time trigger for Azure Functions: [https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer](https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer) 

CRON Expression Descriptor: [https://cronexpressiondescriptor.azurewebsites.net/](https://cronexpressiondescriptor.azurewebsites.net/)
