2016-10-25 6 views
0

は、私は実行に時間がかかりすぎる作業クエリを持っているWHEREで変数を使用しての問題。 Accessフォームフィールドに、開始日順の異なる契約のリストを入力するために使用されています。MSアクセス - 句

次のクエリは、契約開始日(DELSTART)が現在の日付(PRICEDATE)以上の複数の商品(契約開始日を共有する)の個別契約開始日のリストを返します。

関数returndeliveryは、契約の日付属性をdoubleに変換して返します。関数returnnumericdateは日付(yyyymmdd)からdoubleを返します。

SELECT DISTINCT (tblFuturesPrices.Period), 
     returnnumericdate(returndelivery([PERIOD],"S")) AS DELSTART, 
     ReturnNumericDate(Date()) AS PRICEDATE 
FROM tblFuturesPrices 
WHERE returnnumericdate(returndelivery([PERIOD],"S")) >= ReturnNumericDate(Date()) 
GROUP BY PERIOD 
ORDER BY returnnumericdate(returndelivery([PERIOD],"S")); 

理想的には私は、WHERE句で変数DELSTARTとPRICEDATEを参照したいと思いますが、私はそうするときのアクセスは、変数の値を求めるプロンプトを表示します。私は、私のユーザ定義関数を何回も使用する必要があるため、クエリが必要以上に時間がかかると思います。

ソーステーブル(tblFutures)は6ヶ月さかのぼる営業日について各商品/契約の価格が含まれています。

ありがとうございます。

+0

は十分にスマートオプティマイザは気づくであること 'returnnumericdateを3回繰り返し(returndelivery([期間]、「S」))'一度だけ評価される必要があるか、それが派生テーブルまたは 'VIEW'にこれをプッシュする役立つだろうか? – onedaywhen

+0

私は、フォームが読み込まれ、その日が変更されたときにのみ更新する一時テーブルを設定できると考えています。私は、DELSTART宣言がテーブル値を保持し、後でそれらを参照する方が速くなることを期待していました。 – GazG

答えて

0

私のユーザー定義の関数を何度も使用する必要があるため、クエリの実行に時間がかかると思います。

これだけです。しかし、あなたはこれらの機能を減らすことができます

returnnumericdate(returndelivery([PERIOD],"S")) >= ReturnNumericDate(Date()) 

は何ら変わりなくなります

returndelivery([PERIOD],"S") >= Date() 

からreturndeliveryが何をするか分かりません。

補遺

生データのフィルタと日付の値を返す除くreturndeliveryと同じ新しい関数を作成returndeliverydate

SELECT 
    tblFuturesPrices.Period, 
    returndeliverydate([PERIOD],"S") AS DELSTART, 
    Date() AS PRICEDATE 
FROM 
    tblFuturesPrices 
WHERE 
    returndeliverydate([PERIOD],"S") >= Date() 

保存このクエリをし、新しいクエリでソースとして使用:

Select Distinct 
    DELSTART, 
    PRICEDATE 
FROM 
    YourQuery 
+0

あなたのコメントをお寄せいただきありがとうございます。returndeliveryでは、さまざまな契約配信名を受け取ります。 Nov16、Q1 17、Sum18を返し、契約の開始日を二重として返します。アクセスは、私はそれをあきらめた日付ととても厄介なので、たとえばreturndeliveryのために(「Nov16」、「S」)はあなたに私が見20161101. – GazG

+0

を与えるだろう。しかし、日付は「厄介」ではなく、何か魔法でもなく、Doubleのサブタイプでもありません。日付以外のものを使用すると、日付と時刻を扱うときに問題が発生します。補遺を参照してください。 – Gustav

+0

おかげでグスタフ。私はほぼ一時テーブルのストリップの負荷の毎日1つに切り替えるが完了しましたが、新しい機能に関するあなたの提案を見ていきます。 – GazG