C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 日付とNULLで判断して抽出するSQL文


(過去ログ 57 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■32641 / inTopicNo.1)  日付とNULLで判断して抽出するSQL文
  
□投稿者/ Neil (1回)-(2009/02/11(Wed) 20:33:19)

分類:[データベース全般] 

こんにちは。いつも掲示板を見ているNeilと申します。
現在、ASP.NETとC#、SQL-SERVERを使っているシステムを作っています。
OSは、WindowsXPです。


SQL文で初歩的と思いますが質問させてください。
Select文で、名前・会社名・事業エリア・会社コード・社員番号の項目のあるテーブルAと
社員番号・名前・退職日の項目のあるテーブルBがあります。

退職日はDatetime型なのですが、「退職日が入っていない、もしくは退職日が現在の日付より未来の場合の社員」に関しては抽出するとする場合は、どうすれば良いのでしょうか・・・?

まず、退職日が入っていない場合はISNULLを使ってNULLにすればよいのでしょうか?
それともANDなどで「退職日 IS NOT NULL AND 退職日 <= CURRENT_DATE」にすれば良いのでしょうか?


抽出の仕方が色々やっては見ているのですが、上手く行かずに困っております。

queryformat("ISNULL( 退職日 , '' ) and 退職日 <= CURRENT_DATE");

↑のように書いてみたのですが、これだとエラーが出てしまいました。

お手数ですが、ご教授お願い致します。
引用返信 編集キー/
■32644 / inTopicNo.2)  Re[1]: 日付とNULLで判断して抽出するSQL文
□投稿者/ 魔界の仮面弁士 (994回)-(2009/02/11(Wed) 20:56:48)
2009/02/11(Wed) 20:59:51 編集(投稿者)

No32641 (Neil さん) に返信
> まず、退職日が入っていない場合はISNULLを使ってNULLにすればよいのでしょうか?

それは逆でしょう。

ISNULL 関数は、NULL にするためのものでは無く、NULL 以外にするためのものですよ。
この場合はたとえば
  WHERE ISNULL ( 退職日 , 未来日付 ) > CURRENT_DATE
といった所でしょうか。未来日付 の部分は、9999年の日付を固定で入れても良いですし、
DATEADD( ms, 1, CURRENT_DATE ) などとしても良いかと。



> それともANDなどで「退職日 IS NOT NULL AND 退職日 <= CURRENT_DATE」にすれば良いのでしょうか?

これも逆かと。

元の条件は
   【退職日が入っていない】『もしくは』【退職日が現在の日付より未来の場合】
なのですから、そのまま、
  WHERE (退職日 IS NULL) OR (退職日 > CURRENT_DATE)
と書けば良いかと思います。

これを、「ド・モルガンの法則」を適用して変換すると、
  WHERE NOT ( (退職日 IS NOT NULL) AND (退職日 <= CURRENT_DATE) )
という記述になるわけですが、これは Neil さんの書いた条件の真逆になりますね。
引用返信 編集キー/
■32699 / inTopicNo.3)  Re[2]: 日付とNULLで判断して抽出するSQL文
□投稿者/ Neil (2回)-(2009/02/12(Thu) 23:09:56)
No32644 (魔界の仮面弁士 さん) に返信
> 2009/02/11(Wed) 20:59:51 編集(投稿者)
>
> ■No32641 (Neil さん) に返信
>>まず、退職日が入っていない場合はISNULLを使ってNULLにすればよいのでしょうか?
>
> それは逆でしょう。
>
> ISNULL 関数は、NULL にするためのものでは無く、NULL 以外にするためのものですよ。
> この場合はたとえば
>   WHERE ISNULL ( 退職日 , 未来日付 ) > CURRENT_DATE
> といった所でしょうか。未来日付 の部分は、9999年の日付を固定で入れても良いですし、
> DATEADD( ms, 1, CURRENT_DATE ) などとしても良いかと。
>
>
>
>>それともANDなどで「退職日 IS NOT NULL AND 退職日 <= CURRENT_DATE」にすれば良いのでしょうか?
>
> これも逆かと。
>
> 元の条件は
>    【退職日が入っていない】『もしくは』【退職日が現在の日付より未来の場合】
> なのですから、そのまま、
>   WHERE (退職日 IS NULL) OR (退職日 > CURRENT_DATE)
> と書けば良いかと思います。
>
> これを、「ド・モルガンの法則」を適用して変換すると、
>   WHERE NOT ( (退職日 IS NOT NULL) AND (退職日 <= CURRENT_DATE) )
> という記述になるわけですが、これは Neil さんの書いた条件の真逆になりますね。


魔界の仮面弁士さま、有難うございます。
ISNULLの使い方も含めて勘違いしていたようです。
今日、仰るとおりに
>   WHERE (退職日 IS NULL) OR (退職日 > CURRENT_DATE)
表記を含めたSQL文にSELECT文を書き換えた後、上手く動きました。

未来日付と過去日付においての不等号の書き方がイマイチ判らないので、とても助かりました。


本当に有難うございます。
解決済み
引用返信 編集キー/
■32701 / inTopicNo.4)  Re[3]: 日付とNULLで判断して抽出するSQL文
□投稿者/ 魔界の仮面弁士 (995回)-(2009/02/13(Fri) 00:38:41)
No32699 (Neil さん) に返信
> 表記を含めたSQL文にSELECT文を書き換えた後、上手く動きました。
ところで、元の条件は
  【退職日が現在の日付より未来の場合の社員】
ではなく、本当は
  【退職日が現在の日付以降の場合の社員】
という事は無いですか?(> と ≧ の違い)

おそらく、『在職者』を抽出しているのだと思うのですが、もしそうだとすると、
退職日当日は最終勤務日にあたりますから、その日はまだ在職している事になるため、
先の条件だと、正しい結果にならないかと思います。
引用返信 編集キー/
■32721 / inTopicNo.5)  Re[4]: 日付とNULLで判断して抽出するSQL文
□投稿者/ biac (47回)-(2009/02/13(Fri) 10:58:02)
biac さんの Web サイト
No32701 (魔界の仮面弁士 さん) に返信
> 退職日当日は最終勤務日にあたりますから、その日はまだ在職している事になるため、

それは会社によってまちまちですので、 ご注意を。

※ で、 1日違いでえらい差が出ることも f(^^;
退職日 3月 31日 というとき、
・A社 (退職日=最終勤務日=その日の終わりまで社員)
 3月分の社会保険料等は会社持ち
・B社 (退職日=その日から社員じゃない)
 3月分の社会保険料等は個人持ち

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -