SQL计算从上午10点到早上6点的开放时间的客户的不同访问

时间:2015-07-09 08:15:28

标签: php mysql database

我正在为每天上午10点到早上6点开放的俱乐部编写客户忠诚度软件。数据存储在MYSQL中,我想计算客户当月的总访问量。

我正在使用计数(不同(日期)),但是如果玩家在下午5点来到并且一直持续到凌晨3点,在晚上10点和凌晨2点有2笔交易。它将被计为2次访问,而不是1次。

我有一个包含下列列的交易表:

  

ps:括号()中的任何内容都不是真实数据。我每天约有2000笔交易。我也可以更改表结构

 Transaction_ID | Date(not Date/Time) | Customer_ID | Item | price | timestamp
   1            | 11-06-2015    (6pm) | Jane        | drink| 2.00  | 156165166
   2            | 09-06-2015    (2pm) | Jane        | drink| 2.00  | 1433858493
   3            | 10-06-2015    (3am) | Jane        | drink| 2.00  | 1433906073
   4            | 06-06-2015    (6pm) | Jane        | drink| 2.00  | 156165166

当前代码返回{4,Jane}。我正在寻找的答案是{3,Jane}。交易{2,3}应被视为一次访问

SELECT count(distinct(Date)) as visit, Customer_ID 
FROM transaction  
GROUP BY Customer_ID 
WHERE timestamp BETWEEN $timestamp1 AND $timestamp2
$timestamp1 = strtotime("first day of february +10am");
$timestamp2 = strtotime("first day of march +6am");

您如何建议准确计算下面的总访问次数?我能够将表格结构从日期更改为日期/时间。

  

最简单的答案,对我的代码进行的修改最少。

SELECT count(DISTINCT(DATE(DATE_SUB(from_unixtime(timestamp),INTERVAL 6 HOUR))) as visit, Customer_ID 
FROM transaction  
GROUP BY Customer_ID 
WHERE timestamp BETWEEN $timestamp1 AND $timestamp2

2 个答案:

答案 0 :(得分:1)

最简单的方法是在SQL语句中将日期时间(datetimestamp?)字段移回6小时,然后在凌晨4点到12点之间的一天内获得间隔:< / p>

DISTINCT(DATE(DATE_SUB(dt,INTERVAL 6 HOUR)))

SQLFiddle demo

答案 1 :(得分:0)

以下是您需要的代码:

SELECT
  Customer_ID 'Customer ID'
  , COUNT(DISTINCT visit) as 'Visits per month'
  , MONTH(visit) 'Month'
  , YEAR(visit) 'Year'
FROM
  (SELECT
    *
    , CASE 
        WHEN (t_timestamp > Date_StartDate AND t_timestamp < Date_EndDate)
          THEN d_date
        WHEN (t_timestamp < Date_StartDate)
          THEN date_add(d_date, INTERVAL -1 DAY)
       END 'visit'
  FROM
    (SELECT *
      , DATE_ADD(CAST(d_date AS DATETIME), INTERVAL 10 HOUR) Date_StartDate
      , DATE_ADD(DATE_ADD(cast(d_date AS DATETIME), INTERVAL 6 HOUR), INTERVAL 1 DAY) Date_EndDate
    FROM transactions) Results
   ) Results
GROUP BY customer_id, month(visit), year(visit)

另外,这里有SQLFiddle代码的结果。

我没有使用Customer_ID的确切格式(我使用的是INTEGER而不是VARCHAR),并且没有使用您在示例中使用的确切日期,但显然它应该适用于任何事情。

考虑将我的查询中使用的列的名称调整为适当的列名,您应该没问题。