1

我正在计算TotalHours一个在办公室工作的员工,基于Intime并以likeOuttime的形式产生。hh.mm8.30

所以,我在下面写了 sql 查询:

SELECT EMPLOYEEID, sum(DateDiff(mi,isnull(In_Time,0),isnull(Out_Time,0))/60) +
sum(round(DateDiff(mi,isnull(In_Time,0),isnull(Out_Time,0))%60,2))/100.0    +
sum(round(DateDiff(ss,isnull(In_Time,0),isnull(Out_Time,0)),2))/10000.0 as
TotalHours from HR_EMPLOYEES

上面的 sql server 查询最初运行正确,但现在出现以下异常:

java.sql.SQLException: The datediff function resulted in an overflow. The number of 
dateparts separating two date/time instances is too large. Try to use datediff with a 
less precise datepart.

有人可以帮我摆脱这个吗?

4

3 回答 3

2

丢弃空值(从零的日期时间以秒为单位返回 datediff 可能会溢出您的查询)并使用 'hh' 是不是更容易datediff?或者您是否也在寻找分钟数(您需要秒数吗??如果这是用于时间表等,那么秒数真的不重要吗?)

SELECT
    EMPLOYEEID, 
    CASE 
        WHEN In_Time IS NOT NULL AND Out_Time IS NOT NULL THEN sum(DateDiff(hh, In_Time, Out_Time))
        ELSE 0
    END as TotalHours
FROM HR_EMPLOYEES

编辑:好几个小时/分钟只需使用:

SELECT
    EMPLOYEEID, 
    CASE 
        WHEN In_Time IS NOT NULL AND Out_Time IS NOT NULL THEN sum(DateDiff(mi, In_Time, Out_Time)) / 60.0
        ELSE 0
    END as TotalHours
FROM HR_EMPLOYEES

这给了你几个小时加上一小部分分钟(所以 90 分钟 = 1.5 小时)

Edit2:如果您想要分钟作为实际分钟而不是分数,请使用:

SELECT
    EMPLOYEEID, 
    CASE 
        WHEN In_Time IS NOT NULL AND Out_Time IS NOT NULL THEN 
             sum(DateDiff(hh, In_Time, Out_Time) + -- Total hours
             DateDiff(mi, In_Time, Out_Time) % 60 * .01) -- Total minutes (divided by 100 so that you can add it to the hours)
        ELSE 0
    END as TotalHours
FROM HR_EMPLOYEES
于 2013-07-08T10:10:38.637 回答
1

你可以试试这个:

select empid,
convert(varchar(5), sum(datediff(minute, [intime], isnull([outtime], dateadd(hh, 19, DATEADD(dd, DATEDIFF(dd, 0, [intime]), 0))))) / 60) 
+ ':' +
convert(varchar(5),sum(datediff(minute, [intime], isnull([outtime], dateadd(hh, 19, DATEADD(dd, DATEDIFF(dd, 0, [intime]), 0))))) % 60)
as TotalHours
from HR_EMPLOYEES group by empid

一些想法:

  1. 可以intime为空吗?如果是这样,如何以及为什么?我假设intime永远不能为空
  2. 我假设如果outtimenull这样,员工仍在工作,因此使用getdate()但也可能是存在导致null.
  3. null处理的另一个策略outtime可能是让它成为intime一天的午夜。那么这就引出了一个问题,第二天将如何处理。

我认为这里可能有很多边缘情况。你将不得不小心。

编辑:如果根据 OP 的评论为空,则修改outtimeintime每天晚上7 点。outtime使用 最佳方法在 SQL Server 中删除日期时间的时间部分

于 2013-07-08T11:11:19.157 回答
0

不要使用0默认/固定时间点,而是使用其他一些常量日期,这更接近您要处理的值 - 因此不太可能产生溢出。

0在 1900 年 1 月 1 日隐式转换为午夜。例如,更好的常数可能是 01/01/2000:

SELECT EMPLOYEEID, sum(DateDiff(mi,isnull(In_Time,'20000101'),isnull(Out_Time,'20000101'))/60) +
sum(round(DateDiff(mi,isnull(In_Time,'20000101'),isnull(Out_Time,'20000101'))%60,2))/100.0    +
sum(round(DateDiff(ss,isnull(In_Time,'20000101'),isnull(Out_Time,'20000101')),2))/10000.0 as
TotalHours from HR_EMPLOYEES

尽管我看的越多,我就越不确定将日期默认为任何值是否有意义。

于 2013-07-08T10:10:11.963 回答