Вставка объекта datetime.datetime Python в MySQL
У меня есть столбец даты в таблице MySQL. Я хочу вставить объект datetime.datetime() в этот столбец. Что я должен использовать в инструкции выполнения?
now = datetime.datetime(2009,5,5) cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s , %s)",("name", 4,now))
Я получаю сообщение об ошибке: «TypeError: not all arguments converted during string formatting»
Что следует использовать вместо %s ?
В поле времени используйте:
import time time.strftime('%Y-%m-%d %H:%M:%S')
Я думаю, что strftime также относится к datetime.
Скорее всего, вы получаете TypeError, потому что вам нужны котировки вокруг значения datecolumn.
now = datetime.datetime(2009, 5, 5) cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, '%s')", ("name", 4, now))
Что касается формата, у меня был успех с указанной командой (которая включает миллисекунды) и с:
Попробуйте использовать now.date() , чтобы получить объект Date , а не DateTime .
Если это не сработает, то преобразование этого в строку должно работать:
now = datetime.datetime(2009,5,5) str_now = now.date().isoformat() cursor.execute('INSERT INTO table (name, id, datecolumn) VALUES (%s,%s,%s)', ('name',4,str_now))
В какую базу данных вы подключаетесь? Я знаю, что Oracle может быть придирчивым к форматам дат и нравится ISO 8601.
** Примечание: Ой, я просто прочитал, что вы на MySQL. Просто отформатируйте дату и попробуйте ее как отдельный прямой вызов SQL для тестирования.
В Python вы можете получить дату ISO, например
Например, Oracle любит даты типа
insert into x values(99, '31-may-09');
В зависимости от вашей базы данных, если это Oracle, вам может понадобиться TO_DATE:
insert into x values(99, to_date('2009/05/31:12:00:00AM', 'yyyy/mm/dd:hh:mi:ssam'));
Общее использование TO_DATE:
Если вы используете другую базу данных (я видел курсор и думал о Oracle, я мог ошибаться), тогда проверьте их инструменты формата даты. Для MySQL это DATE_FORMAT() и SQL Server – это CONVERT.
Также с помощью такого инструмента, как SQLAlchemy, удаляются такие различия и облегчаются жизнь.
Используйте метод Python datetime.strftime(format) , где format = ‘%Y-%m-%d %H:%M:%S’ .
import datetime now = datetime.datetime.utcnow() cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, %s)", ("name", 4, now.strftime('%Y-%m-%d %H:%M:%S')))
Часовые пояса
Если часовые пояса являются проблемой, часовой пояс MySQL может быть установлен для UTC следующим образом:
cursor.execute("SET time_zone = '+00:00'")
И часовой пояс может быть установлен в Python:
now = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)
Документация MySQL
MySQL распознает значения DATETIME и TIMESTAMP в следующих форматах:
В виде строки в формате “YYY Y- ММ-ДД ЧЧ: ММ: СС” или “Y Y- ММ-ДД ЧЧ: ММ: СС”. Здесь также разрешен “смягченный” синтаксис: любой символ пунктуации может использоваться в качестве разделителя между частями даты или частями времени. Например, “2012-12-31 11:30:45”, “2012 ^ 12 ^ 31 11 + 30 + 45”, “2012/12/31 11 * 30 * 45” и “2012 @12 @31 11”. ^ 30 ^ 45 ‘эквивалентны.
Единственный разделитель, распознаваемый между частью даты и времени и частью доли секунды, – это десятичная точка.
Части даты и времени могут быть разделены T, а не пробелом. Например, ‘2012-12-31 11:30:45’ 2012-12-31T11: 30: 45 ‘эквивалентны.
Как строка без разделителей в формате “ГГГГММДДЧЧММСС” или “ГГММДДЧЧММСС”, при условии, что строка имеет смысл как дата. Например, “20070523091528” и “070523091528” интерпретируются как “2007-05-23 09:15:28”, но “071122129015” является недопустимым (имеет бессмысленную мелкую часть) и становится “0000-00-00 00: 00:00′.
Как число в формате ГГГГММДДЧЧММСС или ГГММДДЧЧММСС, при условии, что число имеет смысл как дата. Например, 19830905132800 и 830905132800 интерпретируются как “1983-09-05 13:28:00”.
Если вы просто используете python datetime.date (не полный datetime.datetime), просто приведите дату в виде строки. Это очень просто и работает для меня (MySQL, Python 2.7, Ubuntu). Колонка published_date является полем данных MySQL, питон переменной publish_date является datetime.date .
# make the record for the passed link info sql_stmt = "INSERT INTO snippet_links (" + \ "link_headline, link_url, published_date, author, source, coco_id, link_id)" + \ "VALUES(%s, %s, %s, %s, %s, %s, %s) ;" sql_data = ( title, link, str(publish_date), \ author, posted_by, \ str(coco_id), str(link_id) ) try: dbc.execute(sql_stmt, sql_data ) except Exception, e: .
select CONVERT(datetime,'2019-09-13 09:04:35.823312',21)
select CONVERT(datetime,'2019-09-13 09:04:35.823',21)
regexp = re.compile(r'\.(\d)') def to_splunk_iso(dt): """Converts the datetime object to Splunk isoformat string.""" # 6-digits string. microseconds = regexp.search(dt).group(1) return regexp.sub('.%d' % round(float(microseconds) / 1000), dt)
Работа с датой и временем в SQLite
В этом примере рассмотрим, как работать с датами и временем в SQLite и Python. Часто требуется вставлять дату или объект datetime из Python в таблицу SQLite. Также нужно читать данные в формате datetime, сохраненные в SQLite, и конвертировать их в объекты соответствующего типа в Python для использования в программе.
Перед работой с программой нужно убедиться, что у вас есть база данных из прошлых уроков sqlite_python.db .
В этом примере будет использоваться таблица new_developers .
Пример вставки/получения объекта DateTime
Обычно при выполнении запроса на вставку объекта datetime модуль sqlite3 в Python конвертирует его в строковый формат. То же самое происходит при получении данных из таблицы — они возвращаются в строковом формате. Разберем на простом примере.
import sqlite3, datetime
def add_developer(dev_id, name, joining_date):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")
sqlite_create_table_query = '''CREATE TABLE new_developers (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
joiningDate timestamp);'''
cursor = sqlite_connection.cursor()
cursor.execute(sqlite_create_table_query)
# вставить данные разработчика
sqlite_insert_with_param = """INSERT INTO 'new_developers'
('id', 'name', 'joiningDate')
VALUES (?, ?, ?);"""
data_tuple = (dev_id, name, joining_date)
cursor.execute(sqlite_insert_with_param, data_tuple)
sqlite_connection.commit()
print("Разработчик успешно добавлен \n")
# получить данные разработчика
sqlite_select_query = """SELECT name, joiningDate from new_developers where /> cursor.execute(sqlite_select_query, (1,))
records = cursor.fetchall()
for row in records:
developer= row[0]
joining_date = row[1]
print(developer, "присоединился", joining_date)
print("тип даты", type(joining_date))
cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")
add_developer(1, 'Mark', datetime.datetime.now())Подключен к SQLite Разработчик успешно добавлен Mark присоединился 2020-12-28 10:58:48.828803 тип даты Соединение с SQLite закрыто
Как можно видеть, в таблицу был вставлен объект даты, но после получения он стал строкой. Однако это не мешает конвертировать результат обратно в объект даты.
Для этого используется detect_types с PARSE_DECLTYPES и PARSE_COLNAMES в качестве аргументов в методе connect модуля sqlite3.
Эта константа используется как значение параметра detect_types метода connect() .
Если использовать этот параметр в методе connect() , то модуль sqlite3 будет парсить тип каждой получаемой колонки.
После парсинга используется словарь конвертации типов для поиска выполнения конкретной функции конвертации.
Эта константа нужна для того же параметра.
При ее использовании интерфейс SQLite сохранит значения имени каждой возвращаемой колонки. После этого можно аналогично использовать словарь для конвертации в нужный тип.
Посмотрим на следующий пример. В нем при считывании объекта datetime из таблицы SQLite нужно получить объединяющий тип — datetime.
import sqlite3, datetime
def add_developer(dev_id, name, joining_date):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db',
detect_types=sqlite3.PARSE_DECLTYPES |
sqlite3.PARSE_COLNAMES)
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")
sqlite_create_table_query = '''CREATE TABLE new_developers2 (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
joiningDate timestamp);'''
cursor = sqlite_connection.cursor()
cursor.execute(sqlite_create_table_query)
# вставить данные разработчика
sqlite_insert_with_param = """INSERT INTO 'new_developers2'
('id', 'name', 'joiningDate')
VALUES (?, ?, ?);"""
data_tuple = (dev_id, name, joining_date)
cursor.execute(sqlite_insert_with_param, data_tuple)
sqlite_connection.commit()
print("Разработчик успешно добавлен \n")
# получить данные разработчика
sqlite_select_query = """SELECT name, joiningDate from new_developers2 where /> cursor.execute(sqlite_select_query, (1,))
records = cursor.fetchall()
for row in records:
developer= row[0]
joining_date = row[1]
print(developer, "присоединился", joining_date)
print("тип даты", type(joining_date))
cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")
add_developer(1, 'Mark', datetime.datetime.now())Подключен к SQLite Разработчик успешно добавлен Mark присоединился 2020-12-28 11:11:01.304116 тип даты Соединение с SQLite закрыто
В результате вернувшиеся данные из таблицы представлены типом datetime.datetime .
Как изменить формат записи datetime
Работаю значит с sql базой через pypyodbc, делаю запрос на добавление строки, а в таблице есть столбец типа datetime, так вот, вставляю значит туда datetime.now().replace(second=0, microsecond=0), а он говорит что в sql при преобразовании данных типа varchar в datetime значение вышло за пределы диапазона. Посмотрел, оказывается в sql дата добавляется вот так YYYY-DD-MM, а у python datetime имеет такой формат: YYYY-MM-DD, как изменить формат даты? Без разницы в питоне или в sql
Как конвертировать формат времни xmltv в datetime
Здравствуйте, форумчане! Есть небольшая задача конвертировать формат "20190618225000 +0300" в.SQLite. Работа с DateTime. Как вытащить из БД и конвертировать в формат DateTime
У меня таблица SQLite Есть колонка INTEGER которая хранит значение типа "2018-06-09 16:10:00" .Изменить формат DateTime ячейки DataGridView
Кто может подсказать как изменить формат даты в ячейки, по умолчанию он такой 09.03.2014, а как.Изменить формат записи DateTimePicker в label
Мне нужно передать дату с timepicker в label в формате "dd.MM.yyyy". В настройках DateTimePicker.Как в DateTime изменить значение дня на 1?
Доброго время суток бойцы. Подскажите такую штуку. делаю я например переменную DateTime .Преобразование из строки в дату
Из функциональности класса datetime следует отметить метод strptime(), который позволяет распарсить строку и преобразовать ее в дату. Этот метод принимает два параметра:Первый параметр str представляет строковое определение даты и времени, а второй параметр - формат, который определяет, как различные части даты и времени расположены в этой строке.
Для определения формата мы можем использовать следующие коды:
%d: день месяца в виде числа
%m: порядковый номер месяца
%H: час в 24-х часовом формате
Применим различные форматы:
from datetime import datetime deadline = datetime.strptime("22/05/2017", "%d/%m/%Y") print(deadline) # 2017-05-22 00:00:00 deadline = datetime.strptime("22/05/2017 12:30", "%d/%m/%Y %H:%M") print(deadline) # 2017-05-22 12:30:00 deadline = datetime.strptime("05-22-2017 12:30", "%m-%d-%Y %H:%M") print(deadline) # 2017-05-22 12:30:00