1

我在 Access 中有一个以自定义格式保存dd/MM/yyyy hh:mm:ss tt的表格,在 VB.NET 2010 中也有一个表格,我得到了一个特定的日期、月份和年份,没有问题,但是当我想查询名为 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'...

如何告诉查询我想要五月所以我会得到 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#;

我将两者都括datevalue方括号中,因为它们都是保留字。

注意我假设您的[date]字段已编入索引。如果这是正确的,我建议的查询应该允许数据库引擎快速识别哪些行符合您的选择标准。如果没有可用的索引,数据库引擎将不得不执行全表扫描——检查表中的每一行以确定其中哪些符合条件。在性能方面,“全表扫描 == 坏”和“索引检索 == 更好”。而当 db 引擎可以使用索引时,检索速度可以轻松快一个数量级。因此,如果您的字段上还没有索引[date],您应该考虑添加一个。

相关的一点是您应该设计查询,以便数据库引擎可以使用索引。如果您的WHERE子句包含函数,例如下面的两个示例,这些函数需要 db 引擎检查表中的每一行,它就无法利用索引......并且您基本上回到了全表扫描。

  • 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 回答