Выбор данных по неделям в SQLite3, Python - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь выбрать конкретные c записи данных в течение недели, однако я не уверен, как заставить мою программу распознавать даты начала и окончания недели. Это мой текущий код функции:

elif report_option == "C":
    print("Expense Report by Week: \n")
    year = int(input("Enter the year of the week's expenses you'd like to view (YYYY): \n"))
    month = int(input("Enter the month the week's expenses you'd like to view (MM): \n"))
    day = int(input("Enter the day the week's expenses you'd like to view (DD): \n"))
    date = datetime.date(year, month, day)
    c.execute("SELECT * FROM tblFinance")
    conn.commit()
    for row in c.fetchall():
        print(row)
    categories = []
    amountspent = []

    for row in c.execute('SELECT CategoryID, AmountSpent from tblFinance WHERE FinanceDate=?', (date,)):
        print(row[0])
        print(row[1])
        categories.append(row[0])
        amountspent.append(row[1])

        plt.plot(categories, amountspent, '-')

        plt.ylabel('Amount Spent')
        plt.xlabel('Category ID')
    plt.show()
    menu()

Любая помощь будет оценена, спасибо! РЕДАКТИРОВАТЬ: я сейчас пытаюсь заставить отдельную функцию работать в течение месяца. Однако подобная функция не подходит для меня! Код для функции месяца ниже:

elif report_option == "D":
    print("Expense Report by Month: \n")
    month_input = input("Enter the year and month of the month's expenses you'd like to view (YYYY-MM): \n")
    c.execute("SELECT * FROM tblFinance")
    conn.commit()
    for row in c.fetchall():
        print(row)
    categories = []
    amountspent = []

    for row in c.execute('SELECT CategoryID, AmountSpent from tblFinance WHERE FinanceDate LIKE ?',
                         (month_input, )):
        print(row[0])
        print(row[1])
        categories.append(row[0])
        amountspent.append(row[1])

        plt.plot(categories, amountspent, '-')

        plt.ylabel('Amount Spent')
        plt.xlabel('Category ID')
    plt.show()
    menu()

Ответы [ 2 ]

1 голос
/ 10 января 2020

Я понимаю, что вы хотите фильтровать по неделе, к которой относится дата, указанная пользователем.

В SQLite вы можете использовать date(mydate, 'weekday, 0') для этого: он дает вам первый день текущего неделю, к которой относится дата mydate. Затем вы можете сделать:

SELECT CategoryID, AmountSpent 
FROM tblFinance 
WHERE FinanceDate >= date(?, 'weekday, 0') AND FinanceDate  < date(?, 'weekday 0', '7 days')

Оба ? должны быть заменены одним и тем же входным значением (дата предоставлена ​​пользователем).

В этом выражении используется интервал полуоткрытого интервала для фильтрации, поэтому он будет правильно обрабатывать временную часть FinanceDate, если таковая имеется.

1 голос
/ 10 января 2020

Вы можете получить даты начала и окончания недели с помощью Python:

week_start = date - datetime.timedelta(days=date.weekday())
next_week_start = week_start + datetime.timedelta(days=7)

Тогда, если вам нужно получить записи за эту неделю, используйте between в запросе:

c.execute('SELECT CategoryID, AmountSpent from tblFinance WHERE FinanceDate BETWEEN ? AND ?', (week_start, next_week_start))

РЕДАКТИРОВАТЬ : для месячного диапазона обновите код следующим образом:

# Leave all the user input the same except you don't need to input day  for month range query
month_start = datetime.date(year, month, 1)
next_month_start = datetime.date(year, (month + 1) % 12, 1)
c.execute('SELECT CategoryID, AmountSpent from tblFinance WHERE FinanceDate BETWEEN ? AND ?', (month_start, next_month_start))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...