Solved

Getting a Date and Skipping Weekends

Posted on 2006-11-03
4
1,264 Views
Last Modified: 2012-06-22
This is (from my view) a complex SQL question, but it's also somewhat of a mathematics problem too.

Here's the Setup...
- Table 1 stores Projects
- Table 2 stores Project Tasks

Everything is pretty standard, except I have a certain field in the projects table that allows me to specific the frequency a task needs to be done for the project in days. So, if a certain project has this field set to 3, I want to do a task on that project every 3 days.

Here's my current SQL statement:

SELECT
proj_ID,
proj_title,
proj_days,
MAX(task_completeddate),
MAX(task_completeddate)+proj_days
CAST(GetDate()-(MAX(task_completeddate)+proj_days) AS INT)
FROM
tbl_projects,
tbl_tasks
WHERE proj_ID = task_project
GROUP BY proj_ID, proj_title, proj_days
ORDER BY CAST(GetDate()-(MAX(task_completeddate)+proj_days) AS INT)

Here's what this gives me...

A List of Projects:
A list of projects ordered by the longest time (in days) OVERDUE I am to do a task. This is calculate by subtracting the sum of the date of the most recent task completed for that project and the project days, subtracted from the current date, converted to an integer.

The following Fields:
0 - Project ID
1 - Project Title
2 - Project Task Frequency Days
3 - The Date of the Most Recent Task Completed for That Project
4 - The Date a Task Was Due to Be Completed
5 - The Number of Days Past Due

This system works like a charm. However, I'm wanting a new component and it's way outside my capabilities. Here's the challenge:

Give me all the same information, but the last two columns would reflect the values based on not counting weekend days.

So, if a task was completed on Friday, 10/3 and it's days were set to 3, the next due date would normally be Monday, 10/6. But with the new values, it would show a task due Wednesday, 10/8 because it skips Saturday and Sunday.

Ideally I would like to solve this problem using SQL, but if no one can help me do that I will accept a vbscript that takes an array generated by these results and gives me what I'm looking for.
0
Comment
Question by:cnxmax
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
4 Comments
 
LVL 10

Expert Comment

by:AaronAbend
ID: 17872805
this case statement takes your task_completed date and converts saturday and dates to the following monday
case datepart(dw,task_completeddate) when 1 then dateadd(d,1,task_completeddate) when 7 then dateadd(d,2,task_completeddate)  else task_completeddate end

From your question I was not sure exactly what you want...but this should get you started. Let me know if you have questions.

SELECT
proj_ID,
proj_title,
proj_days,
MAX(task_completeddate),
MAX(case datepart(dw,task_completeddate) when 1 then dateadd(d,1,task_completeddate) when 7 then dateadd(d,2,task_completeddate)  else task_completeddate end  )+proj_days
CAST(GetDate()-(MAX(task_completeddate)+proj_days) AS INT)
FROM
tbl_projects,
tbl_tasks
0
 

Author Comment

by:cnxmax
ID: 17886663
AaronAbend:

Thanks for the tip. The Case/When SQL code is interesting, but I don't know if that will be the solution. The main reason is that I need to be able to bump things up by a day for each weekend day between Today and the Date of the Last Task Completion. This could be multiple weeks with multiple weekend days.

I don't just want everything that should have been done Saturday to be bumped to Monday. Everything should be moved up two days for every weekend.

I found a way to do this with a script that basically loops through all of the results, looping through each day between the last completed date and today, and bumping the due date up by one day for each weekend day it finds.

Anyway, this may be beyond what I can do in a SQL statement...
0
 
LVL 10

Expert Comment

by:AaronAbend
ID: 17886785
I don't think it is beyond SQL at all.  You can compute the number of weekends by dividing the number of days between getdate() (current datetime) and LastTaskCompleted by 7 and checking the remainder against the day of the week (returned by datepart).  A loop can certainly do it though I was trying to avoid it for performance reasons (big hit in most cases).

Want me to post logic or are you all set?
0
 
LVL 10

Accepted Solution

by:
AaronAbend earned 500 total points
ID: 17886791
http://www.experts-exchange.com/Databases/Microsoft_SQL_Server/Q_22049471.html

check out the responses I just got today on this question I asked regarding date logic
0

Featured Post

Complete VMware vSphere® ESX(i) & Hyper-V Backup

Capture your entire system, including the host, with patented disk imaging integrated with VMware VADP / Microsoft VSS and RCT. RTOs is as low as 15 seconds with Acronis Active Restore™. You can enjoy unlimited P2V/V2V migrations from any source (even from a different hypervisor)

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Let's review the features of new SQL Server 2012 (Denali CTP3). It listed as below: PERCENT_RANK(): PERCENT_RANK() function will returns the percentage value of rank of the values among its group. PERCENT_RANK() function value always in be…
In this article we will learn how to fix  “Cannot install SQL Server 2014 Service Pack 2: Unable to install windows installer msi file” error ?
Via a live example combined with referencing Books Online, show some of the information that can be extracted from the Catalog Views in SQL Server.
Viewers will learn how the fundamental information of how to create a table.

737 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question