2012-10-15 79 views
3

我有以下查询,可以为我生成许多结果。其中之一是每个记录的旧天数。从SQL结果中删除周末

现在我需要一个更准确的数字,通过从等式中删除周末。不知道如何继续努力去理解我找到的答案。我的查询到目前为止是:

select 
    i.incidentnumber, 
    i.priority, 
    i.status, 
    i.subject, 
    i.actualsystem, 
    t.ownerteam, 
    convert(varchar,i.createddatetime,103)[Created], 
    convert(varchar,i.lastmoddatetime,103)[Modified], 
    datediff(day,i.createddatetime,{fn now()})[Days old], 
    datediff(mi,i.createddatetime,{fn now()})[Minutes old], 
    cast(i.createddatetime 
    i.owner 
from 
    incident i with (nolock) inner join task t with (nolock) on t.parentlink_recid = i.recid 
where 
    i.status <> 'Closed' 
    and i.actualsystem <> 'System Administration' 
    --and i.service <> 'Service Request' 
    and t.status in ('Active','Waiting','Accepted') 
    --and t.ownerteam <> 'UK Service Desk' 

order by 
    --t.ownerteam asc 
    --i.actualsystem asc 
    datediff(day,i.createddatetime,{fn now()}) desc 

我正在使用SQL服务器管理器和查询2005年数据库。我必要时发表意见。旧的分钟是今天添加的新列。谁能帮忙?

+0

是周末只有星期六和星期天?假期怎么样?星期五假期是周末的一部分吗?假期一般是否计算在内?本网站上有很多关于计算两个日期之间的天数的问题,最可靠的解决方案通常是[日历表](http://stackoverflow.com/questions/1201874/calendar-table-for-data-仓库),您可以简单地将日期标记为工作日,然后编写简单的查询以获取答案。 – Pondlife

回答

5

DATEPART(dw, your_date)会告诉你,如果这是一个周末。通常1表示星期六,7表示星期日,但可以根据服务器配置进行更改。阅读关于datepart函数以了解其工作原理

+0

实际上1通常意味着星期日和7 =星期六,但逻辑是相同的。您可以使用select @@ DATEFIRST找出服务器上的哪一天设置为= 1。如果它有7,那么周日=一周的第一天。 –

+0

多数民众赞成在有点令人困惑,因为@@ DATEFIRST功能应该返回一周的第一天,这是星期天,但星期日的值为7,而不是1,如你所料。如果你检查这个链接:http://msdn.microsoft.com/pt-br/library/ms181598.aspx,你会看到那个星期日意味着7. – Diego

+0

谁说周日是一周中的第一天?很多人会告诉你这是星期一。这就是为什么最好通过使用日期表来处理与日期相关的任务,而不是基于服务器设置返回不同结果的函数的原因。 – Pondlife

0

如果要计算范围内的工作日数(非周末),最简单的方法就是每周考虑两个周末日期。
例如:(含谐音)

SELECT Datediff(D, '2012-01-01', '2012-01-31')/7 * 5 + 
       Datediff(D, '2012-01-01', '2012-01-31') % 7 WorkDays, 
     Datediff(D, '2012-01-01', '2012-01-31')   AllDays 

要计算工作时间,使用以下查询:

SELECT (T.WORKDAYS - 1) * 10 + OPENINGDAYHOURS + CLOSINGDAYHOURS 
FROM (SELECT Datediff(D, OPEN_DATE, CLOSE_DATE)/7 * 5 + 
           Datediff(D, OPEN_DATE, CLOSE_DATE) % 7 WorkDays, 
       18 - Datepart(HOUR, OPEN_DATE) 
       OpeningDayHours, 
       Datepart(HOUR, CLOSE_DATE) - 8 
       ClosingdayHours, 
       Datediff(D, OPEN_DATE, CLOSE_DATE)     AllDays 
     FROM TABLE1)T 

该查询假定工作日从上午08点到下午6点。

可以找到工作实例here

+0

我想知道我是否能够在一周中的某几天工作或在一天中的工作时间工作。后者肯定听起来有点困难。 – Allegin

+0

为什么'营业时间'会更难?所有的日子都有相同的工作时间数量,所以剩下的就是把日子乘以每天的小时数。 – Gidil

+0

因此,如果每个工作日的营业时间为10天并且有281天的记录保留开放,那么我如何计算除小时以外的真实营业时间。例如营业时间是上午8点到下午6点。创纪录的时间是下午5点,并开放了281天。我怎样才能找到真正的营业时间? – Allegin