2014-11-01 44 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