2017-05-29 62 views
1

我有加入2個表的查詢,以產生某種結果:如何使用GROUP BY和DATE-like列值的子字符串?

select users.*, membership.* from users join membership on membership.id = user.m_id 

的問題是,我需要計算所有用戶,並將其按年(其寄存器年),這樣我可以看到用戶計算每年。

日期不作爲日期格式存儲,我使用varchar,因爲我們只將年份/月份保存爲yearmonth。例如:2017/05

關於users表我有一個名爲join_month的字段。那麼是否有可能將join_month中的值拆分並按年分組?

+0

您應該將其存儲爲日期時間,然後根據需要在輸出上格式化。 '2017'作爲varchar只是一個字符串,作爲一個日期時間,你可以使用'year()'來獲得年份。像'select count(userid),year(joindate)from users group by year(joindate)'一樣。 – chris85

回答

1

這聽起來像你的數據庫結構不能很好地爲你服務。
你可以:

  • 使用SUBSTRING_INDEX()分裂和由具有一年零一個月列

  • 店的日期數據爲DATE類型訪問所需的子

  • 正常化您的最新數據並且只是將日期部分默認爲01,並在查詢時使用YEAR()。

0

是否有可能分裂像2016/05從join_month和組在今年的價值文本值?

當然。使用LEFT(join_month, 4)date_month列中提取前四個字符。如果你確信你的join_month字符串包含一致的數據,這將工作得很好。只要在您的查詢中說GROUP BY LEFT(join_month, 4)

但是,如果您可以在這些列上使用日期算術,您的生活可能會更容易。此表達式將爲您在date_month列中的第一天獲得DATE值。

DATE(CONCAT(LEFT(date_month, 4), '-', RIGHT (date_month, 2), '-01')) 

這是有用的,因爲那麼你可以做的東西一樣

DATE(CONCAT(LEFT(date_month, 4), '-', RIGHT (date_month, 2), '-01')) - INTERVAL 1 QUARTER 

,如果你需要日期抵消。