18

わかった。SQL バックエンドを使ってシンプルな作業をする前に、ここで多くの助けを得ました ... 私には向いていません :( ... 私が働いている小さなオフィスのタイム クロック ソリューションなので、もっと戻ってきました!

現在作業しているテーブルは、6 つの列で構成されています。

  1. clockDate 日付が null でない PK
  2. userName varchar(50) NULL PK ではありません
  3. クロックインタイム(0)
  4. ブレイクアウトタイム(0)
  5. 休憩時間(0)
  6. 出勤時間(0)

前回の質問から自分のステートメントを理解していましたIF NOT EXISTS INSERT ELSE UPDATEが、今は単純なクエリ ウィンドウではなくストアド プロシージャで使用しようとしていますが、成功していません。

基本的に、ユーザーの出勤は簡単です。ただし、ユーザーが出勤せず、昼食のために退勤する場合、ステートメントは既存の行を更新する代わりに行を作成する必要があります。わかりましたので、ここに私のストアドプロシージャがあります:

ALTER PROCEDURE dbo.BreakOut
(
    @userName varchar(50)
)
AS

IF EXISTS (SELECT * FROM Clock WHERE clockDate = GETDATE() AND userName = @userName)
    BEGIN
        UPDATE Clock SET breakOut = GETDATE() 
            WHERE clockDate = GETDATE() AND userName = @userName
    END
ELSE
    BEGIN
        INSERT INTO Clock (clockDate, userName, breakOut) 
            VALUES (GETDATE(), @userName, GETDATE())
    END

ここに私の問題があります...ユーザーがその日にクロックインすると、ストアドプロシージャがまだINSERTステートメントの一部を実行しようとしていて、UPDATE行を実行しないため、主キー違反が発生します。IF NOT EXISTS同じ結果で同様に反転させてみました。ストアド プロシージャで IF-ELSE を機能させるための秘訣は何ですか? これは私が考えている方法で行うことができますか、Mergeそれともステートメントを研究する必要がありますか? 私の計画は、各ワークステーションで単純な Visual Basic プログラムからストアド プロシージャを実行することです。多分私は私の頭の中に入っています :( 残念なことに、私の上司はあまりにも安すぎて、タイムレコーダーソリューションを購入することはできません!

編集:

助けてくれてありがとう!私はこのサイトに恋をしています。質問はとても速く答えを得ます!!! これが私の作業ストアドプロシージャです:

ALTER PROCEDURE dbo.BreakOut
(
    @userName varchar(50)
)
AS

IF EXISTS (SELECT * FROM Clock WHERE DateDiff(dd, GetDate(),clockDate) = 0 AND userName = @userName)
    BEGIN
        UPDATE Clock SET breakOut = GETDATE() 
            WHERE DateDiff(dd, GetDate(),clockDate) = 0 AND userName = @userName
    END
ELSE
    BEGIN
        INSERT INTO Clock (clockDate, userName, breakOut) 
            VALUES (GETDATE(), @userName, GETDATE())
    END

これは適切ですか、それとももっと改善できますか? もう一度ありがとうございました!!!

4

4 に答える 4

11

おそらくこれが問題です: WHERE clockDate = GETDATE()

GetDate は現在の日付と現在の時刻を返しますが、これは clockDate とは一致しません。代わりに DateDiff で日付を比較できます。

WHERE DateDiff(dd, GetDate(),clockDate) = 0
于 2012-08-10T23:06:36.587 に答える
3

あなたの問題は次のように見えます:

ユーザーが 09:00 に出勤したとします。

次のようなレコードが存在する可能性があります。

ClockDate userName clockIn breakOut breakIn clockOut
12/08/2012 ジョー 09:00 NULL NULL NULL

これで、IF ステートメントは次のようになります。

SELECT * FROM Clock WHERE clockDate = "20120812 17:24:13" AND userName = @userName

つまり、このレコードは存在しません。

代わりに、これを試してください:

IF EXISTS (SELECT * FROM Clock  WHERE clockDate = DATEADD(D, 0, DATEDIFF(D, 0, GETDATE())) AND userName = @userName)

また、clockDate を GETDATE() の日付部分として保存していることを確認する必要があります。それ以外の場合は、次のようにクエリを調整する必要があります。

IF EXISTS (SELECT * FROM Clock WHERE DATEADD(D, 0, DATEDIFF(D, 0, clockDate)) = DATEADD(D, 0, DATEDIFF(D, 0, GETDATE())) AND userName = @userName)
于 2012-08-10T23:08:46.627 に答える
1

日付と時刻をGETDATE返すため、更新は実行されません。

http://msdn.microsoft.com/en-us/library/ms188383.aspx

于 2012-08-10T23:07:49.633 に答える