MySQL在x天内查询至少一次

时间:2014-12-21 06:24:21

标签: mysql sql

我的表是这样的:

名称:用户交易数据
日期格式DD / MM / YYYY 数据仅4个月(9月,10月,11月,12月)

Id   User  Date
25   127   23/10/2014 
26   128   25/11/2014 
25   127   22/11/2014
47   17    22/1/2014
25   127   12/9/2014
25   127   22/12/2014 

如果我想在30天内找到至少出现一次的用户。 答案应该是127.因为用户127在所有4个月内至少出现一次 用户128在11月仅完成了一次交易。未完成每月至少一次交易,因此未选择

如何为此编写查询?

4 个答案:

答案 0 :(得分:0)

SELECT * 
FROM TABLE_NAME
WHERE Date_Column >= DATEADD(MONTH, -1, GETDATE()) 

SELECT * 
FROM TABLE_NAME
WHERE Date_Column >= DATEADD(DAY, -30, GETDATE())

https://stackoverflow.com/a/21912827

答案 1 :(得分:0)

SELECT User, COUNT(*) AS number_of_presence FROM (
  SELECT DATE_FORMAT(`Date`,'%Y-%m') AS date_month, User    
  FROM `table`

  GROUP BY date_month, User 
) TMP 
GROUP BY User
HAVING number_of_presence = 4  

group by用于多次避免同一用户。

SQL Fiddle

答案 2 :(得分:0)

我想你已经连续30天了,对吗? 不幸的是,您可能必须将表连接到自身,因为它会查找行的。然后查询将是:

select
  a1.User,
  a1.Date as fromDate,
  a2.Date as toDate,
  datediff(a1.Date, a2.Date) as span
from appearances a1, appearances a2
where
  a1.User=a2.User and
  a2.Date>a1.Date and
  datediff(a2.Date, a1.Date) <= 30;

创建记录结构:

CREATE TABLE appearances
    (`Id` int, `User` int, `Date` date)
;

INSERT INTO appearances
    (`Id`, `User`, `Date`)
VALUES
    (25, 127, '2014-10-23'),
    (26, 128, '2014-11-25'),
    (25, 127, '2014-11-22'),
    (47, 17, '2014-01-22'),
    (25, 127, '2014-09-12'),
    (25, 127, '2014-12-22')
;

小提琴:http://sqlfiddle.com/#!2/1a3363/7/0

答案 3 :(得分:0)

如果您知道要检查用户是否存在的日期,则可以选择日期在您的范围内的所有行WHERE。我会使用BETWEEN关键字。例如,如果您想要在3月份活跃的用户,您可以执行以下操作:

SELECT *
FROM myTable
WHERE dateColumn BETWEEN '2014-03-01' AND '2014-03-31';

对于这个具体示例,您似乎希望用户在过去4个月中至少进行过一次购买。你可以做的是通过使用DATE_SUB()函数设置开始日期来获取过去4个月中每一行的行:

SELECT *
FROM myTable
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH);

完成后,您可以按用户和月份添加GROUP BY语句,以便每个用户和每月获得一行:

SELECT *
FROM myTable
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH)
GROUP BY user, MONTH(date);

一旦你拥有了它,你就可以从中获取用户HAVING四行,因为这意味着他们已经在四个月中的每一个月都进行了购买:

SELECT user
FROM(
  SELECT *
  FROM myTable
  WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH)
  GROUP BY user, MONTH(date)) t
GROUP BY user
HAVING COUNT(*) = 4;

以下是SQL Fiddle示例。

另外,这里有一些很好的日期和时间functions供您牢记。