0

私は Delphi 2010 と Firebird (ローカル) をテストに使用していますが、最終的には MS Sql Server または Oracle に対してアプリを実行する予定です。

日時フィールド (start_time と end_time) があり、過去 30 日間のすべてのレコードまたは一連の日付を選択したい場合、上記の 3 つのデータベース (firebird、sql サーバー、オラクル)

日時フィールドの例は次のようになります: 10/15/2012 9:20:49 AM

以下は、追加の where 句を追加したい SQL ステートメントの例です。

  SQL.Text:= 
      'SELECT J.id, MIN(p.start_Time) as startTime, MAX(p.end_Time) as endTime, ' 
      +  'SUM(p.duration) as TotalDuration ' 
      + 'FROM phases p ' 
      + 'JOIN jobs j ON j.id = p.jobs_Id ' 
      + 'WHERE j.id=:jobId ' 
      + 'GROUP BY j.id';
  1. starttime または endtime が過去 30 日以内のフェーズからすべてのレコードを選択するにはどうすればよいですか?

  2. starttime または endtime が日付の範囲内にあるフェーズからすべてのレコードを選択するにはどうすればよいですか (たとえば、params :beginDateRange & :endDateRange を使用しているとします)。

助けてくれてありがとう

4

2 に答える 2

1

列 (start_time と end_time) がそれぞれの DB の適切な日付型として宣言されている場合、AsDateTime 関数を使用してパラメーターを簡単に設定できるはずです。

Query1.ParamByName('start_time').AsDateTime := Date-30
Query1.ParamByName('end_time').AsDateTime := Date;

これは、さまざまなデータベース間で機能するはずです。たとえば、Firebird ではタイムスタンプとして宣言され、Oracle では日付として宣言されている場合などです。クエリの構造に応じて、同じ SQL ステートメントを使用して、結果セットの必要に応じて start_time と end_times を設定するだけです。実際に取得したいものに応じて、以下は start_time に基づいて過去 30 日間分のレコードを返す必要があります。

例えば:

SQL.Text:= 
      'SELECT J.id, MIN(p.start_Time) as startTime, MAX(p.end_Time) as endTime, ' 
      +  'SUM(p.duration) as TotalDuration ' 
      + 'FROM phases p ' 
      + 'JOIN jobs j ON j.id = p.jobs_Id ' 
      + 'WHERE j.id=:jobId '
      + '  and Trunc(p.start_time) >= :beginDateRange and Trunc(p.start_time) <= :endDateRange '
      + 'GROUP BY j.id';
ParamByName('beginDateRange').AsDateTime := Date - 30;
ParamByName('endDateRange').AsDateTime := Date;

Firebird と Oracle はbetween構文を処理しますが、SQL Server についてはわかりません (ただし、おそらく処理します)。その場合、and句を次のように変更できます。

and Trunc(p.start_time) between :beginDateRange and :endDateRange
于 2012-10-25T04:17:32.710 に答える
0

データベースが日付と時刻に従ってソートされていることを確認してから、ループを実行して、日付が 31 を超える最初のエントリを見つけることができます。その後、そのフィールドのインデックス番号から上に向かってループできることがわかります....切り取りますadotable を使用した最初のループ。すべてのデータを取得するときに、while ループに SQL を追加します。

かわいそうではありませんが、BOFは行います

........ オラクルを使用する場合は、他にも多くの方法があり、特にはるかに優れた方法があります。かわいそうなことはないので、この背後にある概念とロジックのみを使用してください

于 2012-10-24T17:56:25.363 に答える