特定の期間の日付をSQLで検索するには?その2

解決


Delphi大好き  2010-05-15 00:12:05  No: 38454

お世話になります。&前回はありがとうございました。
いつも拝見させてもらっています。

どうやっても出来なかったので、質問させていただきました。

やっているのは、
特定の期間の日付をSQLで検索するには?
と同じなのですが、

値がString型で、日付検索をしたいと思っています。
値は、「05/10」や、「10/05」です。

稀に、「05/10or05/11」
等も書き込まれるため、String型にしました。

そこで、前回の方法と同じ方法で試してみたのですが、
「式中の型が一致しません」、
Stringで統一すると、検索がヒットしなくなります。

以下がソースです。

  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Text := 
'select * from 立会データ WHERE 立会日 BETWEEN :Hiduke1 AND :Hiduke2';

  Query1.paramByName('Hiduke1').asString := DateTostr(DateTimePicker1.date);
  Query1.paramByName('Hiduke2').asString := DateToStr(DateTimePicker2.date);
  try
    query1.Open;
  except end;

何とか、立会日のStringを一時的にDate型にする等して検索する方法はないでしょうか?
それとも、型を素直に日付型に直すべきでしょうか?
(データはソフトが製作中の為空なので、直ぐに作り直せます。)

どうぞよろしくお願いしますm(__)m


どら  2010-05-15 02:06:36  No: 38455

>値は、「05/10」や、「10/05」です。
であれば
ShowMessage(DateTostr(DateTimePicker1.date));
でどのようなメッセージが表示されるか確認すれば何故ヒットしないのか分かるかと思います。


HOta  2010-05-15 02:40:50  No: 38456

DateTostrを使うより、FormatDateTimeを使った方が良いでしょう。


Delphi大好き  2010-05-15 05:06:19  No: 38457

どらさん、HOtaさん、ありがとうございます!
直ぐに解決出来ました^^!!

帰宅したため作成ファイルが手元に無いので、
自宅のMyPcのDelphiからサンプル作って動作確認しました。
(書込者ID違うのはその為です)

自分は頭の中の関数の引き出しが少ないので(&直ぐ忘れるw)、
改めて関数等への理解を痛感しました。

皆さんの知識には本当に感謝です。

半分諦めかけてたので、本当に助かりましたm(__)m。

以下が完成コードです^^。
改めてありがとうございました。

procedure TForm1.Button1Click(Sender: TObject);
var s1,s2:string;
begin
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Text :=
'select * from 立会データ WHERE 立会日 BETWEEN :Hiduke1 AND :Hiduke2';

  s1 := FormatDateTime('mm"/"dd',DateTimePicker1.date);
  s2 := FormatDateTime('mm"/"dd',DateTimePicker2.date);

  Query1.paramByName('Hiduke1').asstring := s1;
  Query1.paramByName('Hiduke2').asstring := s2;
  try
    query1.Open;
  except end;

end;


tor  2010-05-15 05:11:31  No: 38458

とはいえ、そのやり方で
- 年をまたいだ判定はどうするつもりなのか
- 「05/10or05/11」が「05/11」と「05/12」の間だという判定はできるのか(というか間だと判定して正解なのか)
という点が疑問です。素直に日付型にした方がいいんじゃないですか?


Delphi大好き  2010-05-15 06:54:03  No: 38459

少し話が長くなってしまいますが、
その点は大丈夫です。

同じくstring型ですが、インデックス日付(なんてセンスのない命名^^;)をつけてあり、
(個人的にstringで扱うのが簡単で好きと言う理由もありました)
そこに、例「2010/04/20」と言う値が入っています。
ひと月分のデータは「2010/04/20」と全て共通になっていて、
これを組み合わせて検索させる予定です。

また、本職では無く、自営業で趣味を生かして何とか使えるものを、
と言うスタンスでやっていて、かなりアバウトなのは確かです。
その「インデックス日付」は日付型にすべきだったかも・・・と思ってますが^^;

また、ソフトを使うのは自分ではなく、
現在のところ事務さんが立会表をエクセルで作って使用しているのですが、
その代替えにと今のソフトを作っています。

希に、立会日に「05/10以降」とか、「05/10or05/11」
とか、記入されています。

日付検索は事務さんの要望で付けることになり、
実際やってみたら・・・と言うわけです^^;

torさんがご指摘する部分はもっともだと思います。
ただ、「05/10or05/11」や「05/10以降」とか記入してある以上、
String型にしたわけです。

検索が出来なかったら日付型に戻すつもりでしたが^^;

わざわざ二つに分けたのは、
立会で見るときは月換算(立会日:05/01〜月末まで)で出力、

見積もり段階では先月末から今月半ばまで
(インデックス日付:2010/04/20〜2010/05/20)

の二つで印刷出来るようにと事務さんから要望されてます。

また、自分自身は業務のデータの流れが判らないので、
仕事の合間に事務さんから聞き出してその都度改訂してる、
と言う具合です。

自分の善意で始めたもので、立場も弱いので、仕事の都合をプログラムの都合で強制する事は出来ないので・・・
かといってそれが原因でバグっても困る・・・

悩みどころですが、直ぐに作ってくれと要望されてるわけではないので、
(こんな調子では作っても使われないような気もしますが・・・)
ここ数年、失敗を重ねながらも、こんな調子で仕事の合間をぬって作ってます。

無論こんな調子ではまともなものは作れそうには無いので、
勉強をかねてプログラミングと簿記や統計を勉強するために
大学を目指して受験勉強中です。
その為、社員からアルバイターにジョブチェンジしました(笑)。
給料安いですTT。

一時期は時間の無駄と思い、作るのを辞めたところ、
作ってくれないと困ると言われたので、
上記の通りになった次第です。

話が長くなりすぎてしまいましたが^^;

でもご意見ありがとうございます。
明日組み込んでみて、バグつぶしをしながら色々試してみます。


Delphi大好き  2010-05-15 23:43:46  No: 38460

日付検索がおかげさまで完成しました^^。

以下が完成したコードです。
本当に助かりました。

二日で実装完了するとは思いませんでした^^;
それではありがとうございましたm(__)m。

procedure TForm1.Button15Click(Sender: TObject);
var s1,s2,s3:string;
begin
  Query5.Close;
  Query5.SQL.Clear;
  if ComboBox5.Text = '' then begin
    Query5.SQL.Text :=
    'select * from 立会データ WHERE 立会日 BETWEEN :Hiduke1 AND :HIduke2 and インデックス年月 LIKE :index1 ORDER BY 立会日;' ;

  end else begin

  Query5.SQL.Text :=
    'select * from 立会データ WHERE 立会日 BETWEEN :Hiduke1 AND :Hiduke2 and インデックス年月 LIKE :index1 and ' + ComboBox5.Text + ' = "' + ComboBox6.Text + '" ORDER BY 立会日;';

  end;
  s1 := FormatDateTime('mm"/"dd',DateTimePicker1.date);
  s2 := FormatDateTime('mm"/"dd',DateTimePicker2.date);
  s3 := FormatDateTime('yyyy',DateTimePicker2.date);
  
  Query5.paramByName('Hiduke1').asstring := s1;
  Query5.paramByName('Hiduke2').asstring := s2;
  Query5.paramByName('index1').asstring := s3 + '%';
  try
    query5.Open;
  except end;
  Button4Click(Sender);//StringGridを更新
end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加