2014-11-01 29 views
1

我有四列MySQL查询,表没有日期栏

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

如何从该表sum_file_size选择7 1年月日之间”的日期范围表2013'改为'17个月2014年9月'?

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

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之间的任何月份之外,它是排除所有月份吗?

谢谢。

+0

可能重复[创建从MySQL中的日,月,年字段日期(http://stackoverflow.com/questions/3960049/create-date-从日 - 月 - 年 - 字段在MySQL) – andy 2014-11-01 18:31:11

+0

为什么你不能只是改变格式有一个日期列?这样做会容易得多。 – AdamMc331 2014-11-01 18:38:23

+0

已经有人创造了这张桌子。我无法帮助它。 – DevG 2014-11-01 18:43:56

回答

1

请参阅此列表的帮助date and time函数。你应该注意到的第一个(对于这个问题)是MAKEDATE()函数。如果你给它一个常数1,它可以用来得到给定年份的第一天。因此,对于您的示例,这将是:

SELECT MAKEDATE(year, 1) AS firstDayOfYear 
FROM myTable 

现在,您可以使用ADDDATE()函数来添加其余的信息。你可以添加这样的一天:

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

我使用(第1天)的原因是因为我们已经有1天从makedate。所以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示例。我把每个部分留在那里,这样你就可以看到故障是如何一步一步地发挥作用的。

This question may also helpful。

+1

如果只有一个明智的'MAKEDATE(年,月,日)'...... – Rudie 2014-11-01 18:58:52

+0

这种方式正是我期待它的方式......谢谢.. – DevG 2014-11-01 19:11:23

+0

@Rudie是讽刺吗?我从来没有见过这样的功能。 – AdamMc331 2014-11-01 20:51:30

2

我会的日期正好转换为数字形式YYYYMMDD,并利用它来进行比较:

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

你就可以用串类似的东西,甚至将它们转换为日期,但数值方法应该就够了。

1

试试这个,它为我工作

SELECT `SUM_FILE_SIZE` 
FROM mytable 
WHERE cast(concat(`year`,'-',`month`,'-',`day`) AS DATE) BETWEEN '2013-07-01' AND '2014-09-17' 
+0

子查询不是必须的吗? – Rudie 2014-11-01 21:35:20

+0

是的,如果我们不想在结果集中显示列'mydate',我们需要一个子查询。因为它不是我们表格中的实际列。 – 2014-11-02 09:16:49

+1

难道你不能只是'在哪里CAST(CONCAT(年,' - ',月,' - ',日)AS DATE)在x和y'之间? – Rudie 2014-11-02 10:20:35