1

スタック オーバーフローに関するさまざまなトピックを目にしますが、MS-Access の文脈に適合するものはありません...

開始日と終了日が指定された場合、SQL を使用して期間内に各月のレコードを返す方法はありますか?

例えば:

A record has a Start Date of #1/1/2010# and an End Date of #1/31/2010#

Running the query against that single record, I would like the results to be
            #1/4/2010#   (Monday the 4th)
            #1/11/2010#  (Monday the 11th)
            #1/18/2010#   ...etc
            #1/25/2010#

制限

  • MS-Access 2003 : SQL 内にケース/ループがありません (IIF ステートメントは適切です)
  • これはビューのみです。データが改ざんされないため、VBA は使用されません。切断されたレコードセットは私の最後のオプションです。SQLでカスタマイズされた関数を呼び出してこれらの値を返すのに役立ついくつかの方法を見つけたいと思います...おそらく、この日付範囲を反復処理しているときに、グローバルスコープに格納されたクラスがあります...

これは可能ですか?多くのノーが表示されますが、値を関数に渡す方法があれば、これを機能させる方法を見つけることができます。ad/c レコードセットを使用せずにストアド プロシージャをシミュレートする方法がないことは悲しいことです。

4

4 に答える 4

1

これはおそらくレポートに関連しているため、一時テーブル アプローチを使用できますが、特に特定の期間に対して複数のレポートを実行している可能性がある場合 (ただし、複数のユーザーには注意してください)、それほど悪くはありません。

ここで、ちょっとした楽しみとして、非常に醜いが半柔軟なアプローチを示します (10 エントリのテーブルを使用し、273 年の範囲で機能します)。

1つのフィールドを持つt10というテーブルを作成します-id(長くて主キーにします)および10行を入力します:0、1、2、3..9

その後

SELECT #1/1/2010#+
       [t10].[ID]+
       [t100].[iD]*10+
       [t1000].[ID]*100+
       [t10000].[ID]*1000+
       [t100000].[iD]*10000 AS Mondays,
FROM t10, 
     t10 AS t100, 
     t10 AS t1000, 
     t10 AS t10000, 
     t10 AS t100000
WHERE  Weekday(#1/1/2010#+
               [t10].[ID]+
               [t100].[iD]*10+
               [t1000].[ID]*100+
               [t10000].[ID]*1000+  
               [t100000].[iD]*10000)=2;

2010 年 1 月 1 日から 2283 年 10 月 15 日までのすべての月曜日が返され、見苦しいほど遅くはありません。もちろん、質問の解決策を得るには、フィールド date1 と date2 の結果をフィルター処理する必要があります。

これは本質的に、一時テーブルを持つことと同じソリューションですが、クエリごとにテーブルを再構築する必要がないという主な違いがあります。

エントリが 0..99999 のテーブルを 1 つだけ使用しても同じ結果が得られます。一時テーブルを使用する場合は、おそらくそのようなものを使用するでしょう。

于 2010-04-12T15:31:01.563 に答える
1

日付と曜日を含む巨大なカレンダー テーブルを作成できます。2010 年 4 月 12 日、月曜日。2010 年 4 月 13 日、火曜日など。次に、その巨大なテーブルにクエリを実行して結果を取得します。過去と未来にどのくらいの範囲が必要ですか? これは不器用な解決策ですが、クエリがクリーンでシンプルになることは間違いありません。

于 2010-04-10T10:14:10.763 に答える
0

あなたは、単一のレコードから複数のレコード(日付ごとに1つ)を生成するクエリについて話しています。これは、ストアドプロシージャ(データベースがSQLの場合)またはレコードセットを介して行う必要があると思います。クエリはうまくいきません。レコードセットを作成し、必要に応じてレコードを追加することは、私には非常に簡単に思えます。あなたはそれのために行くべきです。

于 2010-04-10T10:54:50.723 に答える
0

あなたの質問を正しく理解していることを願っています。これを行うには、デカルト積を作成する必要があります。そのため、別のテーブルを作成する必要があります。1 から日付範囲に含まれる最大の週数までの数字の ID のみが必要です。

For example table: tCounter(CounterID int)
CounterID
1
2
3
4
etc..

テストデータ用に、データを使用してモックテーブルを作成しました

For example: tDates(DateID int, startdate datetime, enddate datetime)
DateID, Startdate, EndDate
1,  1/1/10      1/31/10
2,  1/18/10     3/4/10
3,  2/1/10      2/28/10

結果を生成するmsaccess sqlステートメントは次のようになります

SELECT tDates.DateID, ((7-Weekday([startdate],3))+[startdate])+(([CounterID]-1)*7) AS NewDay
FROM tDates, tCounter
WHERE (((((7-Weekday([startdate],3))+[startdate])+(([CounterID]-1)*7))<=[enddate]))
ORDER BY tDates.DateID, ((7-Weekday([startdate],3))+[startdate])+(([CounterID]-1)*7);

曜日を月曜日から別の曜日に変更したい場合は、weekday 関数の引数を変更してください。 1=Sunday->7=Saturday

e.g. Weekday([startdate],3)...the 3=Tuesday so result is Monday 
e.g. Weekday([startdate],5)...the 5=Thursday so result is Wednesday 

それがうまくいくことを願っています。

于 2010-04-12T22:44:52.347 に答える