Как сделать выбор из базы данных по дате и времени?
Есть код для баззы данных, в таблице сохраняется task_deadline, отвечающая за время, и я хочу сделать отсортировку даты, указанной в task_deadline, через SELECT чтобы дата в таблице была равна сегодняшней дате, дабы дальше с этим работать, но я не знаю как сделать отсортировку по дате, потому что в sqlite3 нет типа данных Date, а как правильно сделать через тип данных TEXT или INT я не знаю. Помогите пожалуйста.
Вот код для базы данных:
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:
#TODO Remodeling this class to be more redundant
__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('1')
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 {task_deadline} = strftime('%d-%m-%Y %H:%M', 'now', 'localtime', '-5 hours');")
if result:
print('DA')
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()
Ответы (1 шт):
Автор решения: Be3y4uu_K0T
→ Ссылка
Вам нужно удалить секунды и микросекунды, потому что из-за оных строчки не будут совпадать с datetime('now', '-5 hours'), т.к. всегда (почти) секунды и микросекунды не будут равны.
Из нашего обсуждения я написал примерный код:
import datetime
import sqlite3
db = sqlite3.connect('database.db')
cursor = db.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS records
(record text, lifespan text)
''')
date = datetime.datetime.utcnow().replace(second=0, microsecond=0) # Удаляем лишние
cursor.execute('''INSERT INTO records
VALUES (?, ?)
''', ('Something 1', date))
date = datetime.datetime.utcnow().replace(second=0, microsecond=0)
date -= datetime.timedelta(hours=5)
cursor.execute('''INSERT INTO records
VALUES (?, ?)
''', ('Something 2', date))
db.commit()
# тут из-за <= берутся и старые записи,
# но это для того, что если вдруг Вы сделаете запрос в последнюю
# секунду и минута будет равна уже M+1, то запись будет проигнорирована,
# но можно и просто =
cursor.execute('''SELECT * FROM records
WHERE lifespan <= strftime('%Y-%m-%d %H:%M:00', datetime('now', '-5 hours'))
''')
print(cursor.fetchall())