为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
- 【TiDB 版本】:5.7.25-TiDB-v3.0.3
- 【问题描述】:date_add和datediff同时使用时,返回的结果会出错
诊断过程如下:
1.单独运行
在mysql下执行:
select date_add(DATE_ADD(‘2020-11-25’,INTERVAL -1 DAY),INTERVAL DATEDIFF(‘2020-11-25’,‘2020-11-25’) DAY)
得到结果 2020-11-24
在tidb下执行
得到结果 2020-11-24
结果一致,但是放在语句中就不行了
2.放在语句中执行
select ‘1’ as joind,count(distinct if(fideo_v1_device.lib = ‘iOS’,if(fideo_v1_user.original_id is not null and fideo_v1_user.original_id !=’’,fideo_v1_user.distinct_id,fideo_v1_device.distinct_id),null)) as iOS,
count(distinct if(fideo_v1_device.lib in (‘MiniProgram’,‘Android’),if(fideo_v1_user.original_id is not null and fideo_v1_user.original_id !=’’,fideo_v1_user.distinct_id,fideo_v1_device.distinct_id),null)) as Android,
count(distinct if(fideo_v1_device.lib = ‘js’,if(fideo_v1_user.original_id is not null and fideo_v1_user.original_id !=’’,fideo_v1_user.distinct_id,fideo_v1_device.distinct_id),null)) as js
from fideo_v1_device left join fideo_v1_user on fideo_v1_device.distinct_id = fideo_v1_user.original_id and fideo_v1_device.lib=fideo_v1_user.lib where FROM_UNIXTIME(fideo_v1_device.created_at,’%Y-%m-%d’) <=DATE_ADD(‘2020-11-25’,INTERVAL -1 DAY) and FROM_UNIXTIME(fideo_v1_device.created_at,’%Y-%m-%d’) >=date_add(DATE_ADD(‘2020-11-25’,INTERVAL -1 DAY),INTERVAL DATEDIFF(‘2020-11-25’,‘2020-11-25’) DAY)
a.把斜体的部分和斜体加粗的部分都使用固定日期 2020-11-24 得到正确的结果
1 321 36 17390
b.单独使用date_add(DATE_ADD(‘2020-11-25’,INTERVAL -1 DAY) 替换斜体字部分,得到正确的结果
1 321 36 17390
c.部分混合使用FROM_UNIXTIME(fideo_v1_device.created_at,’%Y-%m-%d’) >=date_add(DATE_ADD(‘2020-11-25’,INTERVAL -1 DAY),INTERVAL 0 DAY) 替换粗斜体部分,得到错误结果
1 227 16 8
d.部分混合使用FROM_UNIXTIME(fideo_v1_device.created_at,’%Y-%m-%d’) >=date_add(‘2020-11-24’,INTERVAL DATEDIFF(‘2020-11-25’,‘2020-11-25’) DAY)替换粗斜体部分,得到错误结果
1 227 16 8
e.完全使用拼接 FROM_UNIXTIME(fideo_v1_device.created_at,’%Y-%m-%d’) >=date_add(DATE_ADD(‘2020-11-25’,INTERVAL -1 DAY),INTERVAL DATEDIFF(‘2020-11-25’,‘2020-11-25’) DAY)替换粗斜体部分,得到错误结果
1 227 16 8
证明问题是发生在date_add和datediff同时使用时,或两个date_add叠加时。
查询所使用的表为
CREATE TABLE fideo_v1_user
(
distinct_id
varchar(255) NOT NULL,
lib
varchar(255) NOT NULL,
map_id
varchar(255) NOT NULL,
original_id
varchar(255) NOT NULL,
user_id
varchar(255) DEFAULT NULL,
all_user_profile
json DEFAULT NULL,
created_at
int(11) DEFAULT NULL,
updated_at
int(11) DEFAULT NULL,
PRIMARY KEY (distinct_id
,lib
,map_id
,original_id
),
KEY distinct_id
(distinct_id
),
KEY map_id
(map_id
),
KEY original_id
(original_id
),
KEY distinct_id_lib
(distinct_id
,lib
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
CREATE TABLE fideo_v1_device
(
distinct_id
varchar(255) NOT NULL,
lib
varchar(255) DEFAULT NULL,
device_id
varchar(255) DEFAULT NULL,
manufacturer
varchar(255) DEFAULT NULL,
model
varchar(255) DEFAULT NULL,
os
varchar(255) DEFAULT NULL,
os_version
varchar(255) DEFAULT NULL,
ua_platform
varchar(1024) DEFAULT NULL,
ua_browser
varchar(1024) DEFAULT NULL,
ua_version
varchar(1024) DEFAULT NULL,
ua_language
varchar(1024) DEFAULT NULL,
screen_width
int(11) DEFAULT NULL,
screen_height
int(11) DEFAULT NULL,
network_type
varchar(255) DEFAULT NULL,
user_agent
varchar(2048) DEFAULT NULL,
accept_language
varchar(255) DEFAULT NULL,
ip
varchar(255) DEFAULT NULL,
ip_city
json DEFAULT NULL,
ip_asn
json DEFAULT NULL,
wifi
varchar(20) DEFAULT NULL,
app_version
varchar(255) DEFAULT NULL,
carrier
varchar(255) DEFAULT NULL,
referrer
text DEFAULT NULL,
referrer_host
varchar(2048) DEFAULT NULL,
bot_name
varchar(255) DEFAULT NULL,
browser
varchar(255) DEFAULT NULL,
browser_version
varchar(255) DEFAULT NULL,
is_login_id
varchar(255) DEFAULT NULL,
screen_orientation
varchar(255) DEFAULT NULL,
gps_latitude
decimal(11,7) DEFAULT NULL,
gps_longitude
decimal(11,7) DEFAULT NULL,
first_visit_time
datetime DEFAULT NULL,
first_referrer
text DEFAULT NULL,
first_referrer_host
varchar(1024) DEFAULT NULL,
first_browser_language
varchar(1024) DEFAULT NULL,
first_browser_charset
varchar(1024) DEFAULT NULL,
first_search_keyword
varchar(1024) DEFAULT NULL,
first_traffic_source_type
varchar(1024) DEFAULT NULL,
utm_content
varchar(2048) DEFAULT NULL,
utm_campaign
varchar(2048) DEFAULT NULL,
utm_medium
varchar(2048) DEFAULT NULL,
utm_term
varchar(2048) DEFAULT NULL,
utm_source
varchar(2048) DEFAULT NULL,
latest_utm_content
varchar(2048) DEFAULT NULL,
latest_utm_campaign
varchar(2048) DEFAULT NULL,
latest_utm_medium
varchar(2048) DEFAULT NULL,
latest_utm_term
varchar(2048) DEFAULT NULL,
latest_utm_source
varchar(2048) DEFAULT NULL,
latest_referrer
varchar(2048) DEFAULT NULL,
latest_referrer_host
varchar(2048) DEFAULT NULL,
latest_search_keyword
varchar(2048) DEFAULT NULL,
latest_traffic_source_type
varchar(255) DEFAULT NULL,
created_at
int(11) DEFAULT NULL,
updated_at
int(11) DEFAULT NULL,
PRIMARY KEY (distinct_id
),
KEY distinct_id+lib
(distinct_id
,lib
),
KEY utm_campaign
(utm_campaign
),
KEY utm_source
(utm_source
),
KEY utm_medium
(utm_medium
),
KEY utm_term
(utm_term
),
KEY utm_content
(utm_content
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
数据的话,是这个程序产生的https://github.com/white-shiro-bai/ghost_sa