MYSQL查询两个日期之间的数据,表中没有日期列
我有一张四列的桌子MYSQL查询两个日期之间的数据,表中没有日期列,mysql,date,date-difference,Mysql,Date,Date Difference,我有一张四列的桌子 DAY |MONTH | YEAR | SUM_FILE_SIZE ---------------------------------------- 对于“2013年7月1日”到“2014年9月17日”之间的日期范围,如何从该表中选择总和文件大小 我尝试过这个查询,但它给出的数据不正确 select day, month, year, sum_file_size from bermuda_stat.fileandcite_daily where day between 1
DAY |MONTH | YEAR | SUM_FILE_SIZE
----------------------------------------
对于“2013年7月1日”到“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.
如何获得这两个日期范围之间的所有总和文件大小
请注意,它不包括除日期介于1和17之间以外的所有日期,同样,它也不包括除日期介于7和9之间的任何月份以外的所有月份
谢谢。我只想将日期转换为YYYYMMDD格式的数字,并将其用于比较:
where year*10000 + month*100 + day between 20130701 and 20140917
您可以对字符串执行类似的操作,甚至可以将其转换为日期,但数字方法应该足够了。我只需将日期转换为YYYYMMDD格式的数字,并将其用于比较:
where year*10000 + month*100 + day between 20130701 and 20140917
您可以对字符串执行类似的操作,甚至可以将其转换为日期,但数字方法应该足够了。请参阅此有用函数列表。您应该注意的第一个问题是MAKEDATE()函数。如果你给它一个常数1,它可以用来得到给定年份的第一天。例如,这将是:
SELECT MAKEDATE(year, 1) AS firstDayOfYear
FROM myTable
现在,您可以使用ADDDATE()函数添加其余信息。您可以这样添加日期:
SELECT ADDDATE(MAKEDATE(year, 1), INTERVAL (day - 1) DAY) AS dayAndYear
FROM myTable;
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';
我之所以使用(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 ADDDATE(MAKEDATE(year, 1), INTERVAL (day - 1) DAY) AS dayAndYear
FROM myTable;
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';
这里有一个例子。我把每个部分都放在那里了,这样你就可以一步一步地看到分解的过程
这可能也会有帮助。请查看此有用函数列表。您应该注意的第一个问题是MAKEDATE()函数。如果你给它一个常数1,它可以用来得到给定年份的第一天。例如,这将是:
SELECT MAKEDATE(year, 1) AS firstDayOfYear
FROM myTable
现在,您可以使用ADDDATE()函数添加其余信息。您可以这样添加日期:
SELECT ADDDATE(MAKEDATE(year, 1), INTERVAL (day - 1) DAY) AS dayAndYear
FROM myTable;
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';
我之所以使用(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 ADDDATE(MAKEDATE(year, 1), INTERVAL (day - 1) DAY) AS dayAndYear
FROM myTable;
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';
这里有一个例子。我把每个部分都放在那里了,这样你就可以一步一步地看到分解的过程
这可能也有帮助。试试这个,它对我有用
SELECT `SUM_FILE_SIZE`
FROM mytable
WHERE cast( concat(`year`,'-',`month`,'-',`day` ) AS DATE ) BETWEEN '2013-07-01' AND '2014-09-17'
试试这个,它对我有用
SELECT `SUM_FILE_SIZE`
FROM mytable
WHERE cast( concat(`year`,'-',`month`,'-',`day` ) AS DATE ) BETWEEN '2013-07-01' AND '2014-09-17'
可能的重复为什么不能将格式更改为具有日期列?这样做会容易得多。已经有人创建了这个表。我无法控制。现在就输入答案。请稍等。我理解更改表的困难,但如果没有实际的日期列,所有解决方案都会导致表扫描。此查询无法使用索引,性能将很差。您应该让开发人员知道这个折衷。可能的重复为什么您不能更改格式以有一个日期列?这样做会容易得多。已经有人创建了这个表。我无法控制。现在就输入答案。请稍等。我理解更改表的困难,但如果没有实际的日期列,所有解决方案都会导致表扫描。此查询无法使用索引,性能将很差。你应该让开发人员意识到这个权衡。@Rudie这是讽刺吗?我从来没有见过这样的功能。不是讽刺,而是愿望。函数不存在,这就是为什么我这么说
MAKEDATE(年,日)
是一个奇怪的函数。@Rudie同意。我以为有一个(年、月、日)函数,你会说我把这个答案复杂化了。我们只能做梦。@Rudie,这是讽刺吗?我从来没有见过这样的功能。不是讽刺,而是愿望。函数不存在,这就是为什么我这么说MAKEDATE(年,日)
是一个奇怪的函数。@Rudie同意。我以为有一个(年、月、日)函数,你会说我把这个答案复杂化了。我们只能做梦。子查询不是必需的,是吗?是的,如果我们不想在结果集中显示列“mydate”,我们需要一个子查询。因为它不是我们表中的实际列。难道您不能在x和y之间的位置(CONCAT(year,'-',month,'-',day)转换为日期吗?不需要子查询,是吗?是的,如果我们不想在结果集中显示列“mydate”,我们需要子查询。因为它不是我们表中的实际列。难道您不能在x和y之间的位置(CONCAT(年、'-',月、'-',日)转换为日期吗?