遇到的问题:
执行2022条件查询时报错:从字符串转换日期和/或时间时,转换失败。
emd.DocumentDate字段所存储的数据是20220101格式的bigint类型
数据库:sql server
原sql:
select
bm.OID MaterialID
,emd.FiscalYear year--年度
,DATEPART(QUARTER ,cast(emd.DocumentDate as varchar(255))) Quarter --季度
,-1*Sum(emd.Direction*BusinessQuantity) ReceivedQuantityO
FROM
EMM_MaterialDocument emd
join EMM_MaterialDocumentHead emdh on emd.soid=emdh.soid and emd.Reverse=0
join BK_Material bm on bm.oid = emd.MaterialID
join EMM_MoveType emt ON emd.MoveTypeID = emt.OID
where emt.Code in ('261','262','201','202','541','542','SB201','SB202','601','602','653','654')
and emd.FiscalYear = 2022 and emd.PicktypeID <> (select OID from PickType where Code = '1001400000')
group by bm.OID ,emd.FiscalYear,DATEPART(QUARTER ,cast(emd.DocumentDate as varchar(255)))
查询了sql执行顺序网上是说where是在group by之前执行的,但奇怪的是执行2023的条件去进行查询并不报错或者去掉group by中的DATEPART(QUARTER ,cast(emd.DocumentDate as varchar(255))) 这一段再加上emd.DocumentDate也不会报错,这点就让我非常疑惑查询字段中也存在此公式不会报错但在group by中使用就会报错提示转换失败。由于我需要按照季度汇总所以后续发现两种解决方式
第一种就是外面再套个查询进行汇总
第二种使用TRY_CONVERT(datetime,‘2022-11-12’) 函数
select
bm.OID MaterialID
,emd.FiscalYear year--年度
,DATEPART(QUARTER ,TRY_CONVERT(datetime,cast(emd.DocumentDate as varchar(255)))) Quarter --季度
,-1*Sum(emd.Direction*BusinessQuantity) ReceivedQuantityO
FROM
EMM_MaterialDocument emd
join EMM_MaterialDocumentHead emdh on emd.soid=emdh.soid and emd.Reverse=0
join BK_Material bm on bm.oid = emd.MaterialID
join EMM_MoveType emt ON emd.MoveTypeID = emt.OID
where emt.Code in ('261','262','201','202','541','542','SB201','SB202','601','602','653','654')
and emd.FiscalYear = 2022 and emd.PicktypeID <> (select OID from PickType where Code = '1001400000')
group by bm.OID ,emd.FiscalYear
,DATEPART(QUARTER ,TRY_CONVERT(datetime,cast(emd.DocumentDate as varchar(255))))
TRY_CONVERT会将bigint类型的20220101转换成null,但字符串类型的20220101就可以正常转换为日期类型。
TRY_CONVERT会将不符合转换指定类型的数据返回一个null而DATEPART(QUARTER ,null) 也会返回一个null,所以后续在where里添加了and DATEPART(QUARTER ,TRY_CONVERT(datetime,cast(emd.DocumentDate as varchar(255)))) is null来查找里面的错误数据,却未发现一条。
后续我不使用group by来查询原有过滤数据中是否有null数据但结果是什么都没有。
select
bm.OID MaterialID
,emd.FiscalYear year--年度
,DATEPART(QUARTER ,TRY_CONVERT(datetime,cast(emd.DocumentDate as varchar(255)))) Quarter --季度
FROM
EMM_MaterialDocument emd
join EMM_MaterialDocumentHead emdh on emd.soid=emdh.soid and emd.Reverse=0
join BK_Material bm on bm.oid = emd.MaterialID
join EMM_MoveType emt ON emd.MoveTypeID = emt.OID
where emt.Code in ('261','262','201','202','541','542','SB201','SB202','601','602','653','654')
and emd.FiscalYear = 2022 and emd.PicktypeID <> (select OID from PickType where Code = '1001400000')
and TRY_CONVERT(datetime,cast(emd.DocumentDate as varchar(255))) is null
而当我只查询EMM_MaterialDocument 表的所有数据时却能查询到5条为null的数据
select TRY_CONVERT(datetime,cast(emd.DocumentDate as varchar(255))) n
from EMM_MaterialDocument emd
where TRY_CONVERT(datetime,cast(emd.DocumentDate as varchar(255))) is null
这不禁让我怀疑难道是sql执行顺序并不是where在group by前面吗?还希望有大佬能看见帖子能回答我的疑惑。