2

私は以下のSQLビューを使用しています(それからクリスタルレポートで使用しています)。日付の違い (分単位) が必要ですが、今は週末を除外する必要があります。助けてください :)

SELECT intwc                             AS wc,
       Datediff(n, start_date, end_date) AS time,
       mh_start_date                     AS date,
       'Repair'                          AS type
FROM   dbo.xxxxxxx 
4

4 に答える 4

1

この回答は、週末を分単位で除外することを前提としています。また、この質問の回答に完全に基づいています。

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2013/03/15 23:30:00'
SET @EndDate = '2013/03/18 00:30:00'


SELECT
   (DATEDIFF(MINUTE, @StartDate, @EndDate))
  -(DATEDIFF(wk, @StartDate, @EndDate) * (2*24*60))
  -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN (24*60) ELSE 0 END)
  -(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN (24*60) ELSE 0 END)
于 2013-03-19T13:45:13.160 に答える
0

そのため、すべてのエッジ ケースを処理するには、いくつかの CASE ステートメントをうまく処理できる必要があります。これが私がまとめた例です。Numbers テーブルは単なる集計テーブルで、この場合は 1 から 30 までです。

CREATE TABLE #times (id INT IDENTITY(1,1), start_stamp DATETIME, end_stamp DATETIME)

INSERT INTO #times
        ( 
          start_stamp ,
          end_stamp
        )
SELECT DATEADD(DAY, -2*Number, CURRENT_TIMESTAMP), DATEADD(DAY, -1*Number, CURRENT_TIMESTAMP)
FROM Common.NUMBERS
WHERE Number < 31

SELECT id, start_stamp, end_stamp,
CASE WHEN DATEDIFF(DAY, start_stamp, end_stamp) < 7 THEN
    CASE WHEN DATEPART(weekday, start_stamp) < DATEPART(weekday, end_stamp)
        THEN DATEDIFF(MINUTE, start_stamp, DATEADD(HOUR, -48, end_stamp))
        ELSE DATEDIFF(MINUTE, start_stamp, end_stamp) END
    ELSE DATEDIFF(MINUTE, start_stamp, DATEADD(HOUR, -48*(DATEDIFF(WEEK, start_stamp, end_stamp)), end_stamp)) END
    + CASE WHEN DATENAME(weekday,start_stamp) IN ('Sunday', 'Saturday') THEN 1440 ELSE 0 END
    + CASE WHEN DATENAME(weekday,end_stamp) IN ('Sunday', 'Saturday') THEN 1440 ELSE 0 END
FROM #times

もっと洗練された方法があるかもしれませんが、コードを使用すると、結果セット全体に対して実行し、行ごとに計算できます。

于 2013-03-19T14:02:39.847 に答える
0
SELECT intwc                             AS wc,
   Datediff(n, start_date, end_date) AS time,
   mh_start_date                     AS date,
   'Repair'                          AS type
FROM   dbo.xxxxxxx 
Where DATEPART(dw, start_date) NOT IN (1, 7) and DATEPART(dw, end_date) NOT IN (1, 7)
于 2013-03-19T13:35:32.293 に答える