MySQL【Query execution error: : Value cannot be cast to time】解决方式

Query execution error: : Value cannot be cast to time 错误排查

  • 问题描述
    • 没有问题的查询SQL
    • 有问题的插入SQL
    • 报错信息
    • 错误排查
    • 问题描述
    • 修改后SQL
    • 总结

问题描述

可以正常查询的SQL,将结果集插入到目标表中出现时间格式的转换错误,经过分析是由于日常字段数据转换不规范导致

没有问题的查询SQL

SELECT
* 
FROM
	(
SELECT
	DATE_SUB( '2020-07-23', INTERVAL 1 DAY ) AS 'date_time',
	'0-1' AS 'user_status',
	count( DISTINCT uu.UID ) AS 'user_count' 
FROM
	(
SELECT DISTINCT
	uu.UID 
FROM
	(
SELECT
	* 
FROM
	db_hpc_v1.tbuser 
WHERE
	date_format( IFNULL( RegisterTime, '' ), '%Y-%m-%d' ) < DATE_SUB( '2020-07-23', INTERVAL 0 DAY ) 
	) uu
	LEFT JOIN (
SELECT
	* 
FROM
	db_hpc_v1.tborderb2coffline 
WHERE
	date_format( IFNULL( MakeTime, '' ), '%Y-%m-%d' ) < DATE_SUB( '2020-07-23', INTERVAL 0 DAY ) 
	AND OrgOID NOT IN ( "6487291868429156352" ) 
	) loff ON uu.UID = loff.useruid 
WHERE
	loff.useruid IS NULL 
	) uu
	INNER JOIN (
SELECT
	UserUID 
FROM
	db_hpc_v1.tbuservisitoffline 
WHERE
	date_format( IFNULL( TimeIn, '' ), '%Y-%m-%d' ) < DATE_SUB( '2020-07-23', INTERVAL 0 DAY ) 
	) loff ON uu.UID = loff.useruid 
	) tt;

有问题的插入SQL

INSERT INTO db_warehouse.dm_user_status_report ( date_time, user_state, user_count ) 
SELECT
* 
FROM
	(
SELECT
	DATE_SUB( '2020-07-23', INTERVAL 1 DAY ) AS 'date_time',
	'0-1' AS 'user_status',
	count( DISTINCT uu.UID ) AS 'user_count' 
FROM
	(
SELECT DISTINCT
	uu.UID 
FROM
	(
SELECT
	* 
FROM
	db_hpc_v1.tbuser 
WHERE
	date_format( IFNULL( RegisterTime, '' ), '%Y-%m-%d' ) < DATE_SUB( '2020-07-23', INTERVAL 0 DAY ) 
	) uu
	LEFT JOIN (
SELECT
	* 
FROM
	db_hpc_v1.tborderb2coffline 
WHERE
	date_format( IFNULL( MakeTime, '' ), '%Y-%m-%d' ) < DATE_SUB( '2020-07-23', INTERVAL 0 DAY ) 
	AND OrgOID NOT IN ( "6487291868429156352" ) 
	) loff ON uu.UID = loff.useruid 
WHERE
	loff.useruid IS NULL 
	) uu
	INNER JOIN (
SELECT
	UserUID 
FROM
	db_hpc_v1.tbuservisitoffline 
WHERE
	date_format( IFNULL( TimeIn, '' ), '%Y-%m-%d' ) < DATE_SUB( '2020-07-23', INTERVAL 0 DAY ) 
	) loff ON uu.UID = loff.useruid 
	) tt;

报错信息

1815 - [40040, 2020072717291517203022114803453384091] Query execution error: : Value cannot be cast to time:

错误排查

date_format( IFNULL( TimeIn, '' ), '%Y-%m-%d' ) < DATE_SUB( '2020-07-23', INTERVAL 0 DAY )

问题描述

使用date_format()函数判断时间是否为null时,指定的时间格式不可以是’’,查询没问题,但是在insert into关联使用时,不可以被识别为可转换的时间格式

修改后SQL

INSERT INTO db_warehouse.dm_user_status_report ( date_time, user_state, user_count ) 
SELECT
* 
FROM
	(
SELECT
	DATE_SUB( '2020-07-23', INTERVAL 1 DAY ) AS 'date_time',
	'0-1' AS 'user_state',
	count( DISTINCT uu.UID ) AS 'user_count' 
FROM
	(
SELECT DISTINCT
	uu.UID 
FROM
	(
SELECT
	* 
FROM
	db_hpc_v1.tbuser 
WHERE
	date_format( IFNULL( RegisterTime, '3030-01-01' ), '%Y-%m-%d' ) < DATE_SUB( '2020-07-23', INTERVAL 0 DAY ) 
	) uu
	LEFT JOIN (
SELECT
	* 
FROM
	db_hpc_v1.tborderb2coffline 
WHERE
	date_format( IFNULL( MakeTime, '3030-01-01' ), '%Y-%m-%d' ) < DATE_SUB( '2020-07-23', INTERVAL 0 DAY ) 
	AND OrgOID NOT IN ( "6487291868429156352" ) 
	) loff ON uu.UID = loff.useruid 
WHERE
	loff.useruid IS NULL 
	) uu
	INNER JOIN (
SELECT
	UserUID 
FROM
	db_hpc_v1.tbuservisitoffline 
WHERE
	date_format( IFNULL( TimeIn, '3030-01-01' ), '%Y-%m-%d' ) < DATE_SUB( '2020-07-23', INTERVAL 0 DAY ) 
	) loff ON uu.UID = loff.useruid 
	) tt;

总结

日常SQL语法需要规范书写,对应的字段格式需要正确使用,减少出现没有必要的错误。

你可能感兴趣的:(MySQL)