TypeError:无法将datetime.time与元组进行比较

时间:2017-01-24 09:36:08

标签: python mysql raspberry-pi

我正在研究我的BAC项目。我想从我的MySQL数据库查询时间。这个时间是我的数据库,我想将它与实时进行比较。我从Python语言开始......

[这是我的数据库] [https://i.stack.imgur.com/ROxnQ.png]

这是我的代码,但我有一个错误" TypeError:无法将datetime.time与元组进行比较"

import RPi.GPIO as GPIO
import time
import datetime
import MySQLdb


GPIO.setmode(GPIO.BOARD)
GPIO.setup(40, GPIO.OUT)
GPIO.setup(38, GPIO.OUT)

db = MySQLdb.connect(host="localhost",    # your host, usually localhost
                    user="root",         # your username
                   passwd="Orel_27130",  # your password
                    db="projet")        # name of the data base




while True:
    now = datetime.datetime.time(datetime.datetime.now())
    print (now)
    print time.strftime("%H:%M:%S")
    cursor = db.cursor()
    cursor.execute("SELECT time_open FROM time WHERE id = 2")
    time_open = cursor.fetchall()
    print time_open
    if time_open < now:
        print ("Fermee")
        GPIO.output(38, False)
        GPIO.output(40, True)
    else:
        print ("Ouvert")
        GPIO.output(38, True)
        GPIO.output(40, False)

输出:

((datetime.datetime(2017, 1, 23, 13, 0),),)
Traceback (most recent call last):
  File "mysql.py", line 27, in <module>
    if time_open < now:
TypeError: can't compare datetime.time to tuple

2 个答案:

答案 0 :(得分:4)

您从数据库中获取所有行。这些行存储在元组中,每行都是列的元组。如果要比较行中的第一列(也是唯一一列),则需要提取该列:

time_open = cursor.fetchone()
if time_open[0] < now:

我使用cursor.fetchone()仅获取第一个结果行。

您还需要删除datetime.datetime.time()来电:

now = datetime.datetime.now()

你想要datetime对象,日期,因为这也是MySQL返回的对象类型。

请注意,我假设time_open[0]datetime.datetime个对象。您的回溯在此类对象之前,来自代码中的print time_open语句:

((datetime.datetime(2017, 1, 23, 13, 0),),)

这是一个元组(行),包含另一个包含datetime.datetime()对象的元组(一行包含列)。 MySQL数据库适配器(MySQLdb)根据数据库报告的列类型创建该对象;具有MySQL DATETIME类型的列将在此处转换为datetime对象。

如果您有一个TIME列(评论中似乎提示的新错误消息),那么该值将转换为datetime.timedelta()对象,记录时间过去了。如果您希望这是时间,则需要将timedelta转换为datetime.datetime对象:

midnight = datetime.datetime.combine(datetime.date.today(), datetime.time.min)
if (midnight + time_now[0]) > now:
    # ...

now值转换为相对于午夜的timedelta:

# timedelta since midnight
midnight = datetime.datetime.combine(datetime.date.today(), datetime.time.min)
now_relative = datetime.datetime.now() - midnight

# ...
if time_now[0] < now_relative:

答案 1 :(得分:-1)

您只需将该tupple转换为datetime.datetime格式即可。