1

Accessにカスタム形式のテーブルが保存されていますdd/MM/yyyy hh:mm:ss tt。VB.NET2010のフォームでも、特定の日、月、年を問題なく取得できますが、valueという名前の列の合計をクエリするときに問題が発生します。特定の月または日または年に応じて...

テーブルは次のようなものです。

+-----+-----------+-------------------------+
| id  |     value |       date              |
+-----+-----------+-------------------------+
| id1 |      1499 | 01/01/2012 07:30:11 p.m.|
| id2 |      1509 | 11/02/2012 07:30:11 p.m.|
| id3 |      1611 | 21/10/2012 07:30:11 p.m.|
| id1 |      1115 | 11/10/2012 07:30:11 p.m.|
| id1 |      1499 | 17/05/2012 07:30:11 p.m.|
| id2 |      1709 | 11/06/2012 07:30:11 p.m.|
| id3 |      1911 | 30/07/2012 07:30:11 p.m.|
| id1 |      1015 | 01/08/2012 07:30:11 p.m.|
| id1 |      1000 | 11/05/2012 07:30:11 p.m.|
|+-----+-----------+------------------------+

だから私はクエリを知っています

SELECT SUM(value) FROM mytable WHERE date in='01/05/2012 00:00:00'..。

5月が欲しいので、1499 + 1000=2499になるようにクエリを伝える方法

または、2012年が欲しいと言う方法で、すべてのテーブルの合計を取得します

正しい構文はどれでしょう...

4

3 に答える 3

2

「日付」フィールドのデータ型が日付/時刻の場合、クエリは日付リテラルを使用して、評価する行の範囲を指定できます。クエリの日付リテラルにはyyyy-mm-dd形式を使用し、それらを#文字で囲んで、データベースエンジンに日付/時刻値であることを通知します。

2012年5月の場合:

SELECT SUM([value])
FROM mytable
WHERE [date] >= #2012-05-01# AND [date] < #2012-06-01#;

2012年のすべて:

SELECT SUM([value])
FROM mytable
WHERE [date] >= #2012-01-01# AND [date] < #2013-01-01#;

どちらも予約語なので、両方dateと角かっこで囲みました。value

[date]私はあなたのフィールドが索引付けされていると仮定したことに注意してください。それが正しければ、私が提案したクエリにより、dbエンジンはどの行が選択基準に一致するかをすばやく特定できるはずです。使用可能なインデックスがない場合、dbエンジンは全表スキャンを実行する必要があります---テーブル内のすべての行を調べて、どの行が基準に一致するかを判断します。パフォーマンスに関しては、「全表スキャン==BAD」および「インデックス付き検索==BETTER」です。また、dbエンジンがインデックスを使用できる場合、取得速度は簡単に桁違いに速くなります。したがって、フィールドにまだインデックスがない場合は、インデックスを[date]追加することを検討する必要があります。

関連する点は、dbエンジンがインデックスを使用できるようにクエリを設計する必要があるということです。以下の2つの例のように、dbエンジンがテーブル内のすべての行を検査する必要がある関数が句に含まれている場合WHERE、インデックス作成を利用できません...そして基本的に全表スキャンに戻ります。

  • WHERE Year([Date])=2012 and Month([Date])=5
  • WHERE Year([Date])=2012

テーブルが十分に小さい場合、これはそれほど問題にはなりません。遅れに気付かないかもしれません。ただし、テーブルのサイズが大きくなる場合、または他の大きなテーブルに対して同様のクエリを作成する場合は、この点に注意してください。

于 2012-10-16T04:58:08.533 に答える
1

これは標準のSQLではありませんが、Accessを使用している場合、これは常に機能するはずです。

 SELECT SUM([Value]) FROM Mytable WHERE Year([Date])=2012 and Month([Date])=5

またはこれ、年をフィルタリングしたいだけの場合:

 SELECT SUM([Value]) FROM Mytable WHERE Year([Date])=2012
于 2012-10-16T07:37:26.323 に答える
0

between関数を使用して、月または年を照会できます。

SELECT SUM(value) FROM mytable WHERE date  between to_date ('01/05/2012', 'yyyy/mm/dd')    AND to_date ('31/05/2012', 'yyyy/mm/dd');
于 2012-10-16T04:54:19.870 に答える