1

私は仕事で出席を採用して登録するタイムレコーダーアプリケーションを持っています、

クエリに基づいて、 「Enter」imageButton (エントリ、たとえば「Timein」フィールド)の可視性を非表示に設定しようとしました

したがって、現在timeoutのレコードにが含まれていない場合、ボタンは非表示になりますTimeInUserIdEnter

これはテーブルです:(tIdはPKIDENTITYです)

ここに画像の説明を入力してください

たとえば、これらのレコードに基づくと、最後の(トップ1)はサインアウトされていないため、ユーザーはに表示されませんEnter button。これにより、ユーザーはサインインできます。これは、の最後のアクションがなかったためです。TimeOut

asp.net C#コードビハインドから作業する私は、クエリとして使用してソリューションを実行しようとしていdatedIffました:

しかし、私はここで何かが欠けていると思います

これが私が示したかった間違ったアプローチであるかどうかを考慮に入れないでください..私が必要なものを達成するためのより良い方法がある場合は、そのクエリを無視してみました

select isnull((SELECT TOP 1 case when [TimeOut] is null then '' else convert(nvarchar,[TimeOut]) end FROM tblTime WHERE datediff(day,TimeOut,getdate())=0 and UserId =3571 ORDER BY tId DESC),'')
4

3 に答える 3

1

これにより、userIdのtidが最も高いレコードが検索されます。

SELECT CASE WHEN [TimeOut] IS NULL THEN '' ELSE CONVERT(NVARCHAR,[TimeOut]) END
  FROM tblTime
  WHERE tId = ( SELECT MAX(tId)
                  FROM tblTime
                  WHERE UserId = 3571
               )

ただし、IDは、最新のレコードを取得するための適切な選択ではありません。おそらくあなたはこれらの線に沿ってもっと何かが欲しいでしょう、しかしそれは列の意味と重複があるかもしれないかどうかに依存します...:

SELECT CASE WHEN [TimeOut] IS NULL THEN '' ELSE CONVERT(NVARCHAR,[TimeOut]) end
  FROM tblTime
  WHERE UserId = 3571
    AND ActiveDate = ( SELECT MAX(ActiveDate)
                         FROM tblTime
                         WHERE UserId = 3571
                     )

または、FROM句の一部としてサブクエリを配置することもできます。

于 2012-10-18T00:20:58.050 に答える
1

これについて明示的にクエリが必要な場合(ActiveDateの意味は、ユーザーがサイトで最後にアクティブだったときであると想定します):

SELECT TOP 1 
    CASE WHEN TimeOut IS NULL THEN 0 ELSE 1 END 
FROM tblTime 
WHERE UserID = 3571
ORDER BY ActiveDate DESC

それ以外の場合、オブジェクト全体をコードにロードする場合は、最新のレコードのTimeOutがnullであるかどうかを確認してください。

ただし、ユーザーがサインインおよびサインアウトした日時を追跡できる、ある種のUserActivityテーブルを用意することをお勧めします。null値を調べてユーザーのアクティビティを追跡することは、最も信頼できる方法ではありません。

CREATE TABLE UserActivity
(
    UserActivityID int,
    UserActivityTypeID tinyint,
    DateActivity datetime
)

UserActivityType別のテーブルを保持Sign InしているのでSign Out、とりわけ、追跡したい場合があります。

于 2012-10-18T00:23:49.650 に答える
1

グレン、あなたは私を殴りました!以下は、最新のTimeIn(重複がないと仮定)のレコードを取得し、Enterボタンを表示するかどうかを決定するためのY/Nフラグを提供します。

SELECT (CASE WHEN t1.[TimeOut] IS NOT NULL THEN 'Y' ELSE 'N' END) AS is_enter_button_displayed
  FROM tblTime t1
 WHERE t1.[TimeIn] = (SELECT MAX(t2.[TimeIn]) FROM tblTime t2 WHERE t2.UserId = t1.UserId)
   AND UserId = 3571;
于 2012-10-18T00:24:59.700 に答える