Как конвертировать тип данных TEXT в дату

Есть приложение, которое создает заметки на определенный день и время.
Время и дата добавляется в базу данных с помощью виджета QDateTimeEdit, но в базу добавляется в виде данных TEXT.

Мне надо конвертировать в тип данных DATE, чтобы дальше работать с этой датой.

Однако не знаю как именно нужно конвертировать. Помогите пожалуйста.

Если надо, то могу обновить вопрос и выложить часть кода отвечающую за базу данных.

Вот код базы данных:

import sqlite3
import os
import logging
#from dotenv import load_dotenv
from win10toast import ToastNotifier
import datetime

ENV_LOCATION = os.path.relpath(r'.env')

logger = logging.getLogger(__name__)

#load_dotenv(ENV_LOCATION)


class DatabaseHandler:
    __DB_LOCATION = os.getenv('DB_LOCATION')

    def __init__(self, db_location=None):
        """ Initialize db class variables """
        if db_location is not None:
            """ Allows to set db location through argument """
            self.connection = sqlite3.connect(db_location)
        else:
            self.connection = sqlite3.connect('server.db', detect_types=sqlite3.PARSE_DECLTYPES |
                                            sqlite3.PARSE_COLNAMES)
                
        self.cur = self.connection.cursor()


    

    def select(self, table_name):
        self.cur.execute(f"SELECT * FROM {table_name};")

    def insert(self, table_name, task_name, task_details, task_addition_date, task_deadline):
        self.cur.execute(f"INSERT INTO {table_name} VALUES (:task, :details, :add_date, :deadline);",
                         {'task': task_name, 'details': task_details, 'add_date': task_addition_date,
                          'deadline': task_deadline})
        self.cur.execute(f"SELECT * FROM {table_name} WHERE TaskDeadline='{task_deadline}';")
    """    
    def remind(self, table_name,  task_deadline):
        
        self.cur.execute(f"SELECT * FROM {table_name} WHERE TaskDeadline <= strftime('%Y-%m-%d %H:%M:00', datetime('now', '-1 hours'))")
        self.cur.fetchone()
        print('DA')
    """
    def text_to_datetime(self, table_name):

        self.cur.execute(f"ISERT INTO {table_name} (TaskDeadline) VALUES (strftime('%Y-%m-%d %H:%M:00'))")
        self.cur.execute(f"SELECT TaskDeadline FROM {table_name} WHERE TaskDeadline => strftime('%Y-%m-%d %H:%M:00', datetime('now', '-1 hours'))")
        self.cur.fetchone()
        print('PRIVET')
        
    def delete(self, table_name, record):
        self.cur.execute(f"DELETE FROM {table_name} WHERE TaskName=(:item);",
                         {'item': record})


    

    def update(self, table_name, task_name, new_task_name, new_task_details, new_task_deadline):
        self.cur.execute(f"UPDATE {table_name} SET TaskName=(:new_name), TaskDetails=(:new_details), \
                            TaskDeadline=(:new_deadline) WHERE TaskName=(:old_name);",
                         {'new_name': new_task_name, 'new_details': new_task_details, 'new_deadline': new_task_deadline,
                          'old_name': task_name})

    def create_table(self, table_name):
        self.cur.execute(f""" CREATE TABLE IF NOT EXISTS {table_name}(  TaskName TEXT, \
                                                                        TaskDetails TEXT, \
                                                                        AdditionDate TEXT, \
                                                                        TaskDeadline TEXT)""")

    def transfer_data_between_tables(self, table1_name, table2_name, key_value):
        self.cur.execute(f"INSERT INTO {table2_name} SELECT * FROM {table1_name} WHERE TaskName=(:value);",
                         {'value': key_value})
        self.delete(table1_name, key_value)

    def drop_table(self, table_name):
        self.cur.execute(f"DROP TABLE IF EXISTS {table_name}")
        print(f"Dropped the {table_name} table")

    def __enter__(self):
        return self

    def __exit__(self, ext_type, exc_value, traceback):
        self.cur.close()
        if isinstance(exc_value, Exception):
            self.connection.rollback()
        else:
            self.connection.commit()
        self.connection.close()

Ответы (2 шт):

Автор решения: S. Nick

Попробуйте так:

import sys
import sqlite3
#import datetime

from PyQt5 import QtCore, QtWidgets, QtGui, uic
from PyQt5.Qt import *

app = QApplication(sys.argv)

# !!! QDateEdit
dateEdit = QtWidgets.QDateEdit()
# так dateEdit.setDate(QtCore.QDate(2019, 2, 23))
# или так 
dateEdit.setDate(dateEdit.date().currentDate())
print(f'\n\ndateEdit = {dateEdit}')

today = dateEdit.date()
print(f'today    = {today}')

today = today.toString('yyyy-MM-dd')
print(f'today    = {today}\n') 

# !!! QDateTimeEdit
dateTimeEdit = QtWidgets.QDateTimeEdit()
dateTimeEdit.setDateTime(QtCore.QDateTime(
    QtCore.QDate(2021, 5, 15), QtCore.QTime(15, 7, 33, 123)
                                      )
)
print(f'dateTimeEdit = {dateTimeEdit}')

now = dateTimeEdit.dateTime()
print(f'now          = {now}')

now = now.toString('yyyy-MM-dd hh:mm:ss.zzz')
print(f'now          = {now}\n') 

# !!! sqlite3
con = sqlite3.connect(
    "test_datetime.db", 
    detect_types=sqlite3.PARSE_DECLTYPES | 
                 sqlite3.PARSE_COLNAMES
)
cur = con.cursor()

cur.execute("CREATE TABLE IF NOT EXISTS test(d date, ts timestamp)")
con.commit()        

cur.execute("INSERT INTO test(d, ts) values (?, ?)", (today, now))
con.commit()
cur.execute("SELECT d, ts FROM test")
row = cur.fetchone()

print(today, "=>", row[0], type(row[0]))
print(now, "=>", row[1], type(row[1]))
print()

cur.execute(
    'SELECT current_date as "d [date]", current_timestamp as "ts [timestamp]"'
)
row = cur.fetchone()
print("current_date     ", row[0], type(row[0]))
print("current_timestamp", row[1], type(row[1]))

con.close()

введите сюда описание изображения

→ Ссылка
Автор решения: eri

SQLite позволяет регистрировать свои типы, которые хранятся как текст.

create table log ( date DATE, data TEXT );

В Python регистрируешь 2 функции для сериализации и десериализации:

from datetime import datetime

def convert_date(text):
    return datetime.fromisoformat(text)

def adapt_date(dt):
    return dt.isoformat()

sqlite3.register_converter("DATE", convert_date)
sqlite3.register_adapter(datetime, adapt_date)

А дальше можно прозрачно сохранять и загружать datetime в базу. Выгрузку и загрузку Вам удобнее наверное переписать для QDate.

→ Ссылка