0

以下の関数は、週末を差し引いて 2 つの日付間の合計時間を計算します。2 つの日付が 1 日以上異なる場合は問題なく動作しますが、1 日以内に結果がマイナスになります。よくわかりません。誰でも修正できますか?

ALTER FUNCTION [dbo].[Gettotalhours]
(
    @startdate datetime2,@enddate datetime2 
)
RETURNS bigint
AS
BEGIN

declare @dateweekends int
declare @totaltime bigint


Set @Dateweekends = 
  (DATEDIFF(wk, @StartDate, @EndDate) * 2)
   +(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday'   THEN 1 ELSE 0 END)
   +(CASE WHEN DATENAME(dw, @EndDate)   = 'Saturday' THEN 1 ELSE 0 END)

set @totaltime= DATEDIFF(second,@StartDate,@EndDate)-@dateweekends*24*60*60

return @totaltime

END
4

2 に答える 2

0

SELECT dbo.Gettotalhours( '2012-01-01 22:09:45.000'、 '2012-01-01 22:09:50.000')は、 2012-01-01-日曜日であるため、このケースでは機能しません。両方の引数が1日である場合に、@Dateweekendsをカウントするには:

CREATE FUNCTION [dbo].[Gettotalhours]
(
    @startdate datetime2,@enddate datetime2 
)
RETURNS bigint
AS
BEGIN

declare @dateweekends int
declare @totaltime bigint


Set @Dateweekends = 
  (DATEDIFF(wk, @StartDate, @EndDate) * 2)
   +(CASE WHEN DATEDIFF(day, @StartDate, @EndDate) > 1 AND DATENAME(dw, @StartDate) = 'Sunday'   THEN 1 ELSE 0 END)
   +(CASE WHEN DATEDIFF(day, @StartDate, @EndDate) > 1 AND DATENAME(dw, @EndDate)   = 'Saturday' THEN 1 ELSE 0 END)

set @totaltime= DATEDIFF(second,@StartDate,@EndDate)-@dateweekends*24*60*60

return @totaltime

END

GO

SQLフィドル

そして、次のような一連のテストケースを使用して関数をデバッグできます。

WITH t AS (
    SELECT 2 [sec] UNION ALL
    SELECT 20 UNION ALL
    SELECT 200 UNION ALL
    SELECT 2000 UNION ALL
    SELECT 20000 UNION ALL
    SELECT 200000),

[source] AS (
    SELECT DATEADD(second, -t.[sec], GETDATE()) [from], GETDATE() [to]
    FROM t)

SELECT *, [dbo].[Gettotalhours]([from], [to]) [result] from [source]
于 2013-03-13T18:54:04.473 に答える
0

私は自分の機能を少し変更しました。それは私にとってはうまくいきます。

ALTER FUNCTION [dbo].[Gettotalhours] ( @startdate datetime2,@enddate datetime2 ) RETURNS bigint AS BEGIN

@dateweekends int を宣言 @totaltime bigint を宣言

if DATENAME(dw, @StartDate) in ('Sunday','Saturday') set @dateweekends=0 else Set @Dateweekends = (DATEDIFF(wk, @StartDate, @EndDate) * 2) +(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END) +(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END)

@totaltime= DATEDIFF(second,@StartDate,@EndDate)-@dateweekends*24*60*60 を設定します。

@totaltime を返す

終わり

于 2013-03-14T14:16:46.770 に答える