Table name: activity
Field name: ProcessYM
我有如下的mysql数据。
ProcessYM
==========
201312
201311
201310
201309
201308
201307
201306
201305
201304
201303
201302
201301
201212
201211
201210
201209
201208
201207
201206
我想获取如下结果。我的意思是,mysql查询获取一年中的每个季度,如201312,201309,201306,201303,201212,201209 ..等等。
Actual Output I expect
=======================
ProcessYM
201312
201309
201306
201303
201212
201209
201206
我已经尝试过以下查询,但它不会产生预期的结果。
SELECT distinct `ActProcessYM` from `activity` where `ActProcessYM`%3=0 order by ActProcessYM desc
Output of above query
=====================
201312
201309
201306
201303
201210
201207
非常感谢你的聪明回复。
答案 0 :(得分:1)
您只需要模拟月份部分。您的查询隐式将您的ProcessYM转换为INT。
例如:
SELECT DISTINCT ProcessYM
FROM activity
WHERE RIGHT(ProcessYM,2)%3=0
ORDER BY ProcessYM DESC
答案 1 :(得分:0)
你应该从字段值中检索最后两位数字并按照你的方式进行逻辑。
SELECT distinct `ActProcessYM` from `activity` where substring(ActProcessYM,5,2)%3=0 order by ActProcessYM desc
答案 2 :(得分:0)
这是处理此日期处理的一种不那么快速和肮脏的方式。我相信你正在寻找像这样的MySQL公式:
yyyymm = TRUNC_QUARTER(yyyymm)
也就是说,您正在寻找一种功能,可将任何yyyymm月份符号转换为表示该季度结束月份的符号。
让我们从一个表达式开始,将任何特定的DATETIME表达式转换为季度开头的DATE。
DATE(CONCAT(YEAR(value),'-', 1 + 3*(QUARTER(value)-1),'-01'))
这需要一个时间戳(例如' 2011-04-20 11:15:01')并将其转换为季度开始日期。 (例如' 2011-04-01')
在此日期表单中包含内容非常有用,因为您可以将它们用于日期算术。例如,您可以像这样获得该季度的最后一天。
DATE(CONCAT(YEAR(value),'-', 1 + 3*(QUARTER(value)-1),'-01'))
+ INTERVAL 1 QUARTER - INTERVAL 1 DAY
这是对所有这些内容的撰写:http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/
我发现在处理时间序列数据时尝试坚持使用date数据类型会很有帮助。
答案 3 :(得分:0)
在执行模3(%3)之前,您需要将月值分开。先做一个模数100就可以了:
(ProcessYM % 100) % 3) = 0
或
mod(mod(ProcessYM,100),3) = 0
答案 4 :(得分:0)
试试这个,
SELECT distinct `ProcessYM` from `activity` where SUBSTRING(`ProcessYM`,5,2)%3=0 order by ProcessYM desc