1

私はTotalHoursオフィスで働いていた従業員を に基づいて計算しIntimeOuttimeその結果をhh.mmlikeの形で計算してい8.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 サーバー クエリは、最初は正しく実行されていましたが、現在は次の例外が発生しています。

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

null値を破棄するだけで簡単ではありませんか(datediffをゼロのdatetimeから秒単位で返すと、クエリがオーバーフローする可能性があります)、「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. intimenullになることはありますか?もしそうなら、どのように、そしてなぜですか?intimenullになることは決してないと仮定しています
  2. outtimeもしそうなら、従業員はnullまだ働いているので、の使用を想定していgetdate()ますが、null.
  3. null処理する別の戦略は、その日outtimeの真夜中にすることintimeです。では、次の日をどうするかが問題です。

ここには多くのエッジケースがあると思います。注意が必要です。

編集: OP のコメントに従って nullの場合はouttime、午後 7 時に変更されます。SQL Serverでdatetimeの時間部分を削除するための最良のアプローチを使用 intimeouttime

于 2013-07-08T11:11:19.157 に答える
0

0デフォルト/固定時点として使用する代わりに、代わりに他の一定の日付を使用してください。これは、処理する値に近いため、オーバーフローが発生する可能性が低くなります。

01900 年 1 月 1 日の午前 0 時に暗黙的に変換されます。より適切な定数は、たとえば 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 に答える