这是我的mssql代码段
Select
Sum((Case
When (me.status in ('CLOSED','VOID') and
Convert(DATE,me.end_dt)=CONVERT(DATE,GETDATE()))
Then 1 else 0
end)) as completed,
Sum((Case
When datediff
( hh, cast (CONVERT (DATE, GETDATE()) as varchar)+' '+ '00:00:00.000', me.due_dt)
between 12 and 24 and me.status not in ('CLOSED','VOID')
Then 1 else 0
end)) as Count_12_to_24
from pvr_svc me with(nolock)
对于第一个查询块,这是我到目前为止尝试过的。
expr = func.sum(case([(and_(pvr_svc.status.in_(['CLOSED','VOID']),
(func.convert(DATE, pvr_svc.end_dt)== func.convert(DATE, func.current_date()))
),1)],else_=0)).label('com')
session.query(expr).scalar()
但是我说错了。
****** NotImplementedError:不知道如何对值进行文字引用(类'sqlalchemy.types.DATE')***
我在这里有几个问题,
Q1。如何将datetime列值(在上述情况下为me.end_dt)转换为DATE类型?
Q2。sqlalchemy中的GETDATE()等价于什么?(我尝试过func.current_date(),func.now())
Q3。什么是实现mssql代码片段的最后一块的正确方法?
我遍历了sqlalchemy doc,发现了关于stackoverflow的一些信息,下面是链接,
这是我所拥有的解决方案,
from sqlalchemy import DATE, cast
expr1 = func.sum(case([(
and_(
(func.convert(literal_column('DATE'), pvr_svc.due_dt) == func.convert(literal_column('DATE'), func.getdate())),
pvr_svc.status.in_(['CLOSED','VOID'])
),1
)],else_=0)).label('completed')
expr2 = func.sum(case([(
and_(
func.datediff(literal_column('hh'), cast(func.convert(literal_column('DATE'), func.getdate()), VARCHAR)
+" "+"00:00:00.000",pvr_svc.due_dt)
.between(0,12),~pvr_svc.status.in_(['CLOSED','VOID'])
),1)],else_=0)).label('Count_0_to_12')
session.query(expr1, expr2).all()
或者,
我们可以使用强制转换功能而不是转换功能。
expr1 = func.sum(
case([(and_
((cast(pvr_svc.end_dt,DATE) == cast(func.getdate(),DATE)),
pvr_svc.status.in_(['CLOSED','VOID'])
),1)],else_=0)
).label('com')
session.query(expr1).all()
强制转换和将转换转换为性能没有什么区别,因为强制转换函数在内部以sql中的转换函数实现。在此处查找更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句