1

我有一张有四列的表

 DAY |MONTH | YEAR | SUM_FILE_SIZE
----------------------------------------

如何从该表中选择 sum_file_size 以获取“2013 年 1 月 7 日”到“2014 年 9 月 17 日”之间的日期范围?

我试过这个查询,它给出的数据不正确。

select day, month, year, sum_file_size
from bermuda_stat.fileandcite_daily
where day between 1 and 17 and month between 7 and 9 and year between 2013 and 2014
group by day, month, year
order by year, month, day.

我如何获得这两个日期范围之间的所有 sum_file_size?

请注意,它不包括除 1 到 17 之间的任何日期之外的所有日期,同样,它不包括除 7 到 9 之间的任何月份之外的所有月份?

谢谢。

4

3 回答 3

2

我只需将日期转换为 YYYYMMDD 形式的数字,然后将其用于比较:

where year*10000 + month*100 + day between 20130701 and 20140917

您可以对字符串执行类似的操作,甚至将它们转换为日期,但数字方法就足够了。

于 2014-11-01T18:46:53.183 回答
1

请参阅此有用的日期和时间函数列表。您应该注意的第一个(对于这个问题)是 MAKEDATE() 函数。如果你给它一个常数 1,它可以用来获取给定年份的第一天。因此,对于您而言,这将是:

SELECT MAKEDATE(year, 1) AS firstDayOfYear
FROM myTable

现在,您可以使用 ADDDATE() 函数添加其余信息。您可以像这样添加日期:

SELECT ADDDATE(MAKEDATE(year, 1), INTERVAL (day - 1) DAY) AS dayAndYear
FROM myTable;

我使用 (day-1) 的原因是因为从 makedate 开始我们已经有 1 天了。所以 01-01 + 3 给你 01-04 这是不正确的。

月份部分的工作方式相同,建立在最后一个日期上。

SELECT ADDDATE(ADDDATE(MAKEDATE(year, 1), INTERVAL (day - 1) DAY), INTERVAL (month - 1) MONTH) AS fullDate
FROM myTable

现在,您可以在 where 语句中实现它。由于您知道要限制的日期,因此您可以将它们视为日期。最终查询如下所示:

SELECT SUM(filesize)
FROM myTable
WHERE (ADDDATE(ADDDATE(MAKEDATE(year, 1), INTERVAL (day - 1) DAY), INTERVAL (month - 1) MONTH))
  BETWEEN '2013-07-01' AND '2014-09-17';

这是一个SQL Fiddle示例。我把每个部分都留在那里,所以你可以一步一步地看到分解是如何工作的。

这个问题也可能有帮助。

于 2014-11-01T18:55:27.520 回答
1

试试这个,它对我有用

SELECT `SUM_FILE_SIZE` 
FROM mytable
WHERE cast( concat(`year`,'-',`month`,'-',`day` ) AS DATE ) BETWEEN '2013-07-01' AND '2014-09-17'
于 2014-11-01T19:20:01.387 回答