-1

出席表に次のデータがあります。

Staff_ID  |       User_Attend_Date    |  Business_Day 
  S01     |   2013-05-01 15:18:45.537 |   2013-05-01  
  S01     |   2013-05-02 00:00:00.000 |   2013-05-01  
  S02     |   2013-05-03 06:20:30.225 |   2013-05-02  

スタッフのチェックイン日から 3 時間を引いた日付が営業日と同じ日かどうかを確認する新しい列を表示したいと考えています。営業日と同じであれば、User_Attend_Date のままです。結果は次のようになります。

 Staff_ID  |       User_Attend_Date    |  Business_Day   |     Check_Same_Day
   S01     |   2013-05-01 15:18:45.537 |   2013-05-01    | 2013-05-01 15:18:45.537
   S01     |   2013-05-02 00:00:00.000 |   2013-05-01    | 2013-05-01 15:18:45.537
   S02     |   2013-05-03 06:20:30.225 |   2013-05-02    | 2013-05-03 06:20:30.225

次のコードを試してみましたが、結果を達成できませんでした。

SELECT *, Case WHEN DATEADD(hh, -3, User_Attend_Date)=Business_Day 
THEN User_Attend_Date ELSE BusinessDay END As 'Check_Same_Day' FROM tblAttendance

パーティションを使用しようとしましたが、失敗しました。

DATEADD(hh, -3, User_Attend_Date) OVER (PARTITION BY BusinessDay) AS 'Check_Same_Day'

誰かが私に教えてくれることを願っています.Thanks

4

6 に答える 6

0

Bussiness_day のデータ型 DATE と他の列のデータ型 DATETIME があるため、秒の値が行に表示されていると思います。

SQL 2008 で DATE データ型を使用することは可能ですか?

于 2013-06-04T05:47:53.917 に答える
0

問題は、DATEADD の結果を (DATETIME ではなく) DATE に変換する必要があることです。

DECLARE @att TABLE
(
    User_Attend_Date DATETIME,
    Business_Day DATE
)

INSERT INTO @att
SELECT '2013-05-01 15:18:45.537', '2013-05-01'
UNION ALL
SELECT '2013-05-02 00:00:00.000', '2013-05-01'
UNION ALL
SELECT '2013-05-03 06:20:30.225', '2013-05-02'

SELECT 
    User_Attend_Date,
    Business_Day,
    CASE 
        WHEN CAST(DATEADD(hh, -3, User_Attend_Date) AS DATE) = Business_Day THEN User_Attend_Date
        ELSE Business_Day
    END AS 'Check_Same_Day'
FROM @att

これにより、必要な結果が得られ、2 つのアイテムがルールに一致したことが示されます。

于 2013-06-04T05:09:23.373 に答える