• ベストアンサー

SQLパズルの欠勤という問題で質問があります。

SQLパズルの欠勤という問題で質問があります。 社員が1年間(閏年じゃない年)で、罰点を40点以上をためたか チェックをするSQLで、罰点の集計期間1年間の条件が したのようになっているんですが、これだと 集計期間が366日になると思うんですが、これは 本の内容が間違っているということでしょうか? WHERE absent_date BETWEEN CURRENT_TIMESTAMP - INTERVAL '1' YEAR AND CURRENT_TIMESTAMP

質問者が選んだベストアンサー

  • ベストアンサー
  • 23468
  • ベストアンサー率66% (6/9)
回答No.2

BETWEEN A AND B は「A以上B以下」を表す式です。 http://dev.mysql.com/doc/refman/4.1/ja/comparison-operators.html 中学受験勉強でやる「植木算」と同じですね。 つまり、A, BにDATE型を指定すれば1日が重なるし、 No.1の補足のようにDATETIME型を指定すれば1秒間が重なります。 したがって、その本の内容は 「日付が変わった直後の1秒間を除けば」正しい答えが得られることになります。 著者の詰めが甘いってことですね。 より正確を期すなら>=と<を使って書いたほうが無難です。

heppokonayuta
質問者

お礼

ありがとうございました~。

その他の回答 (1)

  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.1

CURRENT_TIMESTAMP には時刻も含まれています。 今現在の時刻として、その期間に含まれる日数を実際に指折り数えてみてください。 ※ absent_date は日付のみですが、それはその日の未明0時0分を意味します。

heppokonayuta
質問者

補足

アドバイスありがとうございます。 実際にデータを入れて、気になったことがあったので それもよかったら教えてください。 過去2日間で、罰点40点以上の社員をとろうとした場合。 パターン1のSQLを実行すると、2日分のデータが返ってきてきました。 でも、パターン2のSQLを実行すると3日分のデータが返ってきます。 ---パターン1--- SELECT * FROM absenteeism WHERE absent_date BETWEEN '2007-05-03 12:00:00' - INTERVAL '2' DAY AND '2007-05-03 12:00:00' 結果 2007-05-03 2007-05-02 ---パターン2--- SELECT * FROM absenteeism WHERE absent_date BETWEEN '2007-05-03 00:00:00' - INTERVAL '2' DAY AND '2007-05-03 00:00:00' 結果 2007-05-03 2007-05-02 2007-05-01

関連するQ&A