gpt4 book ai didi

python - MS SQL Python 日期时间晚于但不等于 '>' 返回结果为 '>='

转载 作者:太空宇宙 更新时间:2023-11-04 02:18:21 25 4
gpt4 key购买 nike

我正在尝试查询 Microsoft SQL 数据库以获取在上一个循环中返回的日期时间之后的所有记录。我使用“>”运算符,但我看到的结果是“>=”(大于或等于)。

Python (3.6.5 Win10) 脚本:

import pyodbc  # version 4.0.24
import time
import datetime
import json
con = pyodbc.connect("DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=mydb;UID=myuid;PWD=mypwd")
cur = con.cursor()
i = 0
lastDatetime = datetime.datetime.strptime('01Jan1970', '%d%b%Y')
while i < 60:
print("{0}: SELECT * FROM dbo.Data WHERE datetime > '{1}'".format(str(i), lastDatetime))
cur.execute("SELECT * FROM dbo.Data WHERE datetime > ?", lastDatetime)
rows = cur.fetchall()
for k, v in enumerate(rows):
jsonMsg = json.dumps({
"transaction_id": v[1],
"plu": v[2].strip(),
"qty": int(v[3]),
"dateTime": str(v[4])
}, separators=(',', ':'))
print(str(jsonMsg))
lastDatetime = v[6]
print("lastDatetime set to: {0}".format(lastDatetime))
i = i + 1
time.sleep(5)

产生:

0: SELECT * FROM dbo.Data WHERE datetime > '1970-01-01 00:00:00'
{"transaction_id":3201,"plu":"3","qty":1,"dateTime":"2018-08-01 10:45:40.560000"}
lastDatetime set to: 2018-08-01 10:45:40.560000
{"transaction_id":3202,"plu":"5","qty":1,"dateTime":"2018-08-01 10:45:51.563000"}
lastDatetime set to: 2018-08-01 10:48:47.653000
{"transaction_id":3230,"plu":"8","qty":2,"dateTime":"2018-08-01 10:48:47.653000"}
lastDatetime set to: 2018-08-01 10:48:47.653000
1: SELECT * FROM dbo.Data WHERE datetime > '2018-08-01 10:48:47.653000'
{"transaction_id":3230,"plu":"8","qty":2,"dateTime":"2018-08-01 10:48:47.653000"}
lastDatetime set to: 2018-08-01 10:48:47.653000
2: SELECT * FROM dbo.Data WHERE datetime > '2018-08-01 10:48:47.653000'
{"transaction_id":3230,"plu":"8","qty":2,"dateTime":"2018-08-01 10:48:47.653000"}
lastDatetime set to: 2018-08-01 10:48:47.653000

我在 SQL Server Management Studio 中运行查询并得到预期结果:

SELECT * FROM dbo.Data WHERE datetime > '2018-08-01 10:48:47.653' 

不返回任何记录。

我遗漏了什么或者我应该在 python 脚本中更改什么以获得预期的结果?

谢谢。

编辑:将 '' 添加到数据时间周围的 sql 字符串的打印中。对结果没有影响。

最佳答案

您遇到了此处提到的 SQL 2016+ 的重大更改:

Under database compatibility level 130, implicit conversions from datetime to datetime2 data types show improved accuracy by accounting for the fractional milliseconds, resulting in different converted values. Use explicit casting to datetime2 datatype whenever a mixed comparison scenario between datetime and datetime2 datatypes exists. For more information, refer to this Microsoft Support Article.

Breaking Changes in SQL Server 2016

问题是您的表仍在使用旧的 datetime 数据类型。这是一种非常奇怪的类型。它没有毫秒分辨率。它的分辨率实际上是 1/300 秒。所以实际存储的值并不总是像它看起来的那样。存储不精确,例如 float 。

新的更好的 datetime2 具有更高的精度并且始终存储十进制小数秒。无论如何,SQL 2016 改变了 datetime 转换为 datetime2 的方式,这有一个副作用,即涉及隐式转换的比较有时会中断。

要解决此问题,请将表中的数据类型更改为 datetime2(3) 以实现 1 毫秒的精度。或者强制参数为 datetime,而不是 datetime2。我不知道 pyodbc 是否允许这样做,但您可以轻松地在查询中强制转换:

cur.execute("SELECT * FROM dbo.Data WHERE datetime >= cast(? as datetime)", lastDatetime)

现在不是将表列转换为 datetime2,而是将参数值转换为 datetime,并且比较按预期进行。

或者将您的数据库兼容级别降低到 120。

关于python - MS SQL Python 日期时间晚于但不等于 '>' 返回结果为 '>=',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52124222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com