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

Boo*_*Tan 7 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
Run Code Online (Sandbox Code Playgroud)
$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

val*_*lex 1

最简单的方法是在 SQL 语句中将日期时间 ( date, timestamp?) 字段向后移动 6 小时,然后您将获得一天中从凌晨 4 点到中午 12 点的时间间隔:

DISTINCT(DATE(DATE_SUB(dt,INTERVAL 6 HOUR)))
Run Code Online (Sandbox Code Playgroud)

SQLFiddle demo