1

従業員情報を含むデータベースと、このデータベースからデータを取得するプログラムがあります。

データベース構造は次のようになります。

ID | Date        | signedIn | SignedOut
1    01-10-2012    08:00:00   16:00:00
1    14-10-2012    08:00:00   16:00:00
1    13-09-2012    08:00:00   16:00:00

その後、データを取得しようとすると01-10-201215-10-2012最初の 2 行のみを取得します。したがって、総労働時間は 16 時間になります。

しかし、先月のものであるにもかかわらず、最後のものも取得するため、現在、合計金額は 24 になります。

SQL文:

SELECT Info.UserID, Info.SurName, Info.FirstName, timetabel.Date, 
FROM Info
INNER JOIN timestabel
ON Info.UserID = Bruger_tidstabel.UserID
WHERE Info.UserID = '1'
AND timetabel.Date >= '01-10-2012'
AND timetabel.Date <= '14-10-2012'"

文が機能するので、データベースからデータを取得できます。

データベースに伝える方法はありますか?

4

4 に答える 4

1

次のような BETWEEN ステートメントを試してください。

"... WHERE Info.UserID = '1' AND (timetabel.Date BETWEEN '01-10-2012' AND '14-10-2012')"

() の有無にかかわらず確認してください。データベースによっては、日付パターンが正しいかどうかも確認してください。

于 2012-09-21T12:42:28.483 に答える
0

クリスチャンが言うように、日付は常に期待どおりに扱われるとは限らないため、日付を文字列として表すときは常に注意する必要があります。日付と日付を比較するには、日時型を使用するか、日付関数 (DATEADD、DATEDIFF など) のいずれかを使用してください。残念ながら、SQL は多くの場合エラーなしで実行されますが、SQL から解釈されたものは常に期待どおりとは限りません!

于 2012-09-21T12:52:28.953 に答える
0

演算子を使用できますBETWEEN。これは WHERE 句で使用され、2 つの値の間のデータ範囲を選択します。

SELECT column_name(s)
 FROM table_name
 WHERE column_name
 BETWEEN value1 AND value2

Dateテーブル フィールドを日付またはタイム スタンプ形式にすることをお勧めします。また、年は次のように日付形式の前に表示されます。

SELECT Info.UserID, Info.SurName, Info.FirstName, timetabel.Date, FROM Info INNER JOIN timestabel ON Info.UserID = Bruger_tidstabel.UserID WHERE Info.UserID = '1' AND timetabel.Date BETWEEN '2012-10-01' AND '2012-10-14'
于 2012-09-21T12:43:55.370 に答える
0

あなたの質問に直接答えることはありませんが (他の回答者はすでに回答しています)、日付範囲を操作する際の一般的な落とし穴について警告したいと思います。

timetabel.Date <= '14-10-2012'

に格納されている日付/時刻が の場合はどうなりますtimetabel.Date14-10-2012 08:30? この日付は除外されます。個人的には、このより安全なテストを使用することを好みます

timetabel.Date < '15-10-2012'

これは上記のものと同等です (原因の時間部分を除く)。だから比較するのではなく

table.column <= date

比較します

table.column < (date + one day)
于 2012-09-21T13:00:36.207 に答える