使用pyodbc连接SQL Server时实时获取当前分钟数据报错求助
解决SQL Server中获取当前分钟数据的语法问题
你误用了MySQL的MINUTE()和NOW()函数,SQL Server有对应的替代语法,同时要注意:仅匹配分钟数会导致跨小时的相同分钟数据被误选,正确逻辑应该是匹配当前时间所在的完整分钟区间(年、月、日、小时、分钟完全一致)。
正确的SQL语法方案
方案1:用DATEPART逐一匹配时间分量
通过DATEPART函数提取时间的各维度分量,分别与当前时间的对应分量对比:
SELECT item FROM sys.table1 WHERE DATEPART(YEAR, Time) = DATEPART(YEAR, GETDATE()) AND DATEPART(MONTH, Time) = DATEPART(MONTH, GETDATE()) AND DATEPART(DAY, Time) = DATEPART(DAY, GETDATE()) AND DATEPART(HOUR, Time) = DATEPART(HOUR, GETDATE()) AND DATEPART(MINUTE, Time) = DATEPART(MINUTE, GETDATE())
方案2:截断时间到分钟(更简洁高效)
用DATEADD和DATEDIFF把Time列和当前时间都截断到分钟级别,直接对比:
SELECT item FROM sys.table1 WHERE DATEADD(MINUTE, DATEDIFF(MINUTE, 0, Time), 0) = DATEADD(MINUTE, DATEDIFF(MINUTE, 0, GETDATE()), 0)
原理是计算时间距离0点的分钟数,再转换回时间,自动去掉秒和毫秒,只保留到分钟维度。
修改后的Python代码
替换cursor.execute中的SQL语句即可,以下是完整代码:
import pyodbc conn = pyodbc.connect('Driver={SQL Server};' 'Server=RON\SQLEXPRESS;' 'Database=sys;' 'Trusted_Connection=yes;') cursor = conn.cursor() # 使用方案2的简洁写法 cursor.execute(''' SELECT item FROM sys.table1 WHERE DATEADD(MINUTE, DATEDIFF(MINUTE, 0, Time), 0) = DATEADD(MINUTE, DATEDIFF(MINUTE, 0, GETDATE()), 0) ''') for i in cursor: print(i[0]) # 直接输出item内容,避免打印元组格式
当当前时间为2023-06-30 00:01:00时,运行代码会输出:
Orange Banana
内容的提问来源于stack exchange,提问作者panzer
相关产品推荐
相关产品推荐

