2017-11-27 8 views
0

私はSQLのエキスパートではなく、これを理解するための助けが必要です。私はSQL Server 2012データベースを使用した給与計算アプリケーションを作成しています。このデータベースは、ユーザーがパンチインした時間を把握し、パンチアウトしてから作業時間と他の計算を作業時間に基づいて計算する必要があります。作業時間は、午前9時30分から午後5時30分までの時間として計算されます。ここでは、ロジックは次のとおりです。Selectステートメントで条件変数を割り当てるSQL Server

  • 後でより午前9時30分で、ユーザーのパンチは作業開始場合は午前9時30分、作業開始時刻より早いで、ユーザーのパンチは午前9時30分
  • に を設定されている場合、実際の時間が になるでしょう。
  • 午後5時30分以降にパンチアウトした場合作業終了時間は、 午後5:30に設定されます。
  • ユーザが午後5時30分までにパンチアウトする場合。作業終了時間は実際にパンチアウト時間に に設定されます

ここで私は試してみましたが、どこにも行かなかった。どんな助けでも高く評価されます:

declare @start time; 
declare @end time; 
select @start=cast('09:30:00.0000000' as time) 
select @end=cast('17:30:00.0000000' as time) 
    SELECT Datename(dw,LastUpdate) as WeekDay 
    ,FORMAT(PunchIn,'MM/dd/yyyy hh:mm tt') as PunchIn 
    ,FORMAT(PunchOut,'MM/dd/yyyy hh:mm tt') as PunchOut 
    ,case 
     --employee punched in before 9:30 so take 9:30 as start time 
     when datediff(mi,@start,cast(PunchIn as time))<0 then (select @start='09:30:00.0000000') end 
    from TimeTracker 

これは完全なSQLではなく、私が採用しようとしているロジックを見ることができます。私の質問は、パンチインタイムやパンチアウトタイムなど、別の列の値に基づいて開始時間または終了時間を設定する方法です。 SQLでは、when句の一部としてselect文にエラーが発生します。私はこれを他の言語でも簡単に行うことができますが、SQLで困惑しています。

+0

'(@ start = '09:30:00.0000000 ')'を '' '09:30:00.0000000'」に変更するか、さらに「then @ start」 – Beth

答えて

0

あなたはほとんどそこにいました! 以下は変更されたSQLコードです。 CASE stmtの完全な構文については、https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sqlを参照してください。

declare @start time; 
declare @end time; 
select @start=cast('09:30:00.0000000' as time) 
select @end=cast('17:30:00.0000000' as time) 
SELECT Datename(dw,LastUpdate) as WeekDay 
    , FORMAT(PunchIn,'MM/dd/yyyy hh:mm tt') as PunchIn 
    , FORMAT(PunchOut,'MM/dd/yyyy hh:mm tt') as PunchOut 
    , Start = case 
     --employee punched in before 9:30 so take 9:30 as start time 
     when datediff(mi,@start,cast(PunchIn as time)) < 0 then @start 
     else cast(PunchIn as time) 
     end 
    , Stop = case 
     --employee punched out after 17:30 so take 17:30 as end time 
     when datediff(mi,@end,cast(PunchOut as time)) > 0 then @end 
     else cast(PunchOut as time) 
     end 
from TimeTracker 

注:元のコードには変数@startへの参照が含まれていますが、これは許可されていません。 "変数に値を割り当てるSELECT文は、データ検索操作と組み合わせてはいけません"(実際のT-SQLエラーメッセージ)。したがって、ポストされたソリューションには、5つの列(平日、パンチイン、パンチアウト、開始、停止)で構成される結果セットが表示されます。変数を使用し、複数のレコードがクエリから返された場合、最後のレコードのみがこれらの変数に保存されます。セット全体を別のテーブルに格納するには、 "FROM"キーワードの前に、追加の行を追加してください。

into [table name] 

+0

あなたの思慮深い答えをありがとう。私が全員から受け取ったすべての答えと良い指針に基づいて、私はどのように進めるべきか非常によく理解しています。私はStackoverflowを初めて使うので、私は受け入れられた答えとして答えを受け入れる方法がわかりません - この場合、私はZ.Mを取るでしょう。私の質問に対する包括的な答えとしてのJarzebowskiの答えですが、他のすべての答えが私の最終的な解決に貢献しました。みんな、ありがとう。 –

0

CASEステートメントは、特定の値式を選択するために使用されます。ステートメントには特定の値の結果が必要です。 CASEステートメントはではないif条件...実行可能コードに評価されません。

ので、代わりにこの:

--Bad 
CASE WHEN 1=0 THEN Select @[email protected] ELSE Select @[email protected] END 

あなたはこのようなことをしなければならない。

--Better 
SELECT @x = CASE WHEN 1=0 THEN [email protected] ELSE [email protected] END 

これは、あなたがまだ表現でいくつかのコードを置くことができます示していますが、それはまだまで評価されなければなりませんa 。ここで問題のために

、それはより次のようになります。私はまだここでの割り当てを行うことに疑問ものの

case 
    --employee punched in before 9:30 so take 9:30 as start time 
    when datediff(mi,@start,cast(PunchIn as time))<0 then '09:30:00.0000000' 
    else PunchIn end 

このコードは、私が見たほとんどの管轄区域で、このようなPunchIn時間を変更することは非常に違法であるため、興味深いです。従業員が懲戒以前に就職した場合(経営陣は早期に入社しないように要請し、執筆を開始し、最終的には雇用するなど)、そのプロセスが法律を遵守するまでは、彼らが働いた時間のためにそれらを支払う。再び、これは管轄ですので、弁護士に相談してください。しかし、労働者から時間を盗むように見えます。

+0

ありがとうと私は非常に思慮深く、教育的な答えに感謝します。パンチの時間を変えることについてのポイントはよく取られます。問題のコードは、午前9時半から午後5時30分までの実際の時間を計算するために使用されます。給与(給与)計算ではなく、任意のパフォーマンスインセンティブを計算するためのものです。従業員は、実際のパンチインとパンチアウトの時間に基づいて支払われます。私はとにかく人事部からあなたのコメントを掲載します。もう一度ありがとうございます。 –

関連する問題