关于在group by中使用DATEPART函数遇到的问题

遇到的问题:

执行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会将不符合转换指定类型的数据返回一个nullDATEPART(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前面吗?还希望有大佬能看见帖子能回答我的疑惑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值