Problem solve Get help with specific problems with your technologies, process and projects.

Calculating weeks between two dates

I need to calculate the weeks between two different dates, but I would like to know the easiest way to accomplish this task. Is the best way to compare the two date fields and then divide by seven, or is there a better way I am not aware of? Suppose we have a begin date of '02-FEB-03' and an end date of '17-FEB-03'. I would like to see the weeks as two because the 17th is not a Tuesday. I do not know how to decide if a certain date is on a specific day of the week.

There are a number of ways to approach this problem, and the solution -- if you will excuse the expression -- depends on what the meaning of the word "week" is.

I'm having trouble understanding your comment "I would like to see the weeks as 2 because the 17th is not a Tuesday," so let's take a slightly different example:

Su Mo Tu We Th Fr Sa
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28

In this example, we want the number of weeks between February 6 and 19.

First method: one. One week after the 6th is the 13th. Another week is the 20th. Since we are only as far as the 19th, it's not two weeks yet.

Second method: two. The number of days is 14 if we count both the 6th and the 19th at the beginning and end of the specified range. Since there are seven days in a week, 14 / 7 = 2.

Third method: one. We shouldn't count both the beginning and end days. We don't do it for years, for example. How many years between 1999 and 2007? Most people would say 8, not 9, and they do this by subtracting the earlier from the later. So using days, 19 - 6 = 13. Then 13 / 7 = 1.857142... Which is one.

Fourth method: two. We want a whole number of weeks, so it's okay to round 1.857142 up to 2.

Fifth method (same as the third): one. It's not okay to round up.

Sixth method: one. Whole weeks? There's only one whole week in that date range, and it's the week from the 9th to the 15th. In fact, if the starting date were the 3rd and the ending date the 21st, that would be 18 (or 19) days, and there's still only one whole week in there.

Seventh method: three. February 6th is in week 6 of 2003. February 19th is in week 8. Between them are several days from each of three different weeks.

Eighth method: two. February 6th is in week 6 of 2003. February 19th is in week 8. Subtract the week numbers to get 2.

Whew. Okay, I guess what you're looking for is for me to show you some SQL. Unfortunately this is difficult without knowing which database you're using, since they all have different syntax for date functions, often wildly so.

Besides, I'm not sure which interpretation you want. However, I really dislike discussing a perfectly good question without at least some kind of answer, so I will recommend that you investigate the date functions of your database.

Look for a DATEDIFF function that yields a result in days, or perhaps a TO_DAYS function that converts a date into a day number so you can subtract to find the difference in days. Divide by seven, and take the integer portion, discarding the remainder (look for a FLOOR function, or CAST AS INTEGER). This corresponds to the third method above. Make sure that your users actually want this answer and not one of the others.

Be careful if you use a date function to convert the date to a week number, like Oracle's TO_CHAR(datecolumn,'IW'). You would get week 8 for February 21 and week 9 for February 24 and they're not a week apart, unless you're using the seventh or eighth method.

Dig Deeper on Oracle and SQL