Как получить значения между часами?

Есть задача, получить данные между 2 часами (например между 11 и 14) и сделать из них график, пробовал range, но всегда одно из значений пропадает:

x = []
y = []
xFrom = 11
xTo = 14
for hour in range(int(xFrom), int(xTo)):
    x.append(hour)
    cursor.execute("SELECT count FROM users WHERE hour = ?;", (hour,))
    records = cursor.fetchall()
    print(records)
    for record in records:
        y.append(record[0])
        break
x.append(xTo)
print(x)
print(y)
ax = plt.gca()
ax.set_facecolor("white")
plt.plot(x, y)
plt.savefig(str(call.message.chat.id) + '.png')
bot.send_photo(call.message.chat.id, open(str(call.message.chat.id) + '.png', 'rb'))
os.remove(str(call.message.chat.id) + '.png')

И вывод получается такой (тут я пробовал между 9 и 12 часами):

[(2901,)]
[(3012,)]
[(2581,)]
[9, 10, 11, 12]
[2901, 3012, 2581]

И из-за этого matplotlib не может правильно построить график.

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

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


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

Автор решения: CrazyElf

Кажется, вы просто не понимаете, как работает range в питоне. Он не включает правую границу при переборе. Вы потом "вручную" добавляете в x правую границу уже после цикла через x.append(xTo), но значение то по этому x вы в базе не запрашиваете в цикле и не получаете. Вам нужно поправить аргументы range, если я всё правильно понял. И int там лишние, у вас уже целые числа же там:

for hour in range(xFrom, xTo + 1):
                            ^^^^

А ручное добавление правой границы в x уберите:

x.append(xTo) # <- это не нужно
→ Ссылка
Автор решения: MaxU

Гораздо проще сразу выбрать все нужные вам записи одним запросом и избавиться от ненужного цикла:

cursor.execute(
    "SELECT hour, count FROM users WHERE hour between ? and ?", 
    (xFrom, xTo)
)

PS не стоит называть столбцы в таблицах зарезервированными именами (count). В SQL существует функция count() для подсчета количества строк.

→ Ссылка