将日期时间值导入TSQL时的日期格式(0)无效

时间:2016-04-04 20:10:36

标签: python tsql pyodbc

我正在尝试将我的pandas数据帧中的日期时间值导入到TSQL表的日期时间列中。

问题是,如果我的任何列包含NULL值,我会收到错误' NaT'

见下文:

import pyodbc
import pandas as pd

cnxn = pyodbc.connect(driver='{SQL Server Native Client 10.0}',
                      host=server,database=dbname,
                      trusted_connection=tcon,
                      user=uname,password=pword)

cursor = cnxn.cursor()

df.head()
            Date_1          Date_2
1   2015-07-01 10:53:16 2015-07-01 00:13:09
2   2015-07-03 10:31:16 2015-07-01 16:39:40
3   2015-06-26 14:39:19 2015-06-24 13:56:17

for index, row in df.iterrows():
cursor.execute("""
INSERT INTO Table(
Date1,Date2)"""
"""VALUES (?,?)""",
row['Date1'],row['Date2'])

cnxn.commit() 
  

DataError:(' 22007',' [22007] [Microsoft] [SQL Server Native Client   10.0]日期格式无效(0)(SQLExecDirectW)')

它与我的datetime列中的Null值有关。当我在数据框中查看空值时,它们显示为NaT。

我不知道如何不向我的TSQL表导入任何内容。

2 个答案:

答案 0 :(得分:0)

使用NULLIF()语句将INSERT INTO (...) VALUES (...)更改为INSERT INTO (...) SELECT ...,如下所示:

import pyodbc
import pandas as pd

cnxn = pyodbc.connect(driver='{SQL Server Native Client 10.0}',
                      host=server,database=dbname,
                      trusted_connection=tcon,
                      user=uname,password=pword)

cursor = cnxn.cursor()

df.head()
            Date_1          Date_2
1   2015-07-01 10:53:16 2015-07-01 00:13:09
2   2015-07-03 10:31:16 2015-07-01 16:39:40
3   2015-06-26 14:39:19 2015-06-24 13:56:17

for index, row in df.iterrows():
cursor.execute("""
INSERT INTO Table(
Date1,Date2)"""
"""SELECT NULLIF(?,'NaT'),NULLIF(?,'NaT') """,
row['Date1'],row['Date2'])

cnxn.commit() 

答案 1 :(得分:0)

NaT表示非一次性,它表示null为numpy.datetime64类型。 datetime64类型不支持pyodbc期望的None值。

使用DataFrame.to_dict方法将数据框导出到dict,该方法将处理从datetime64datetime.datetime的类型转换

>>> df
                      Date_1 Date_2
1 2016-04-04 15:50:40.794355   None
2 2016-04-04 15:50:40.794355   None
3 2016-04-04 15:50:40.794355   None
>>> rows = df.to_dict(orient="records")
>>> pprint(rows)
[{'Date_1': Timestamp('2016-04-04 15:50:40.794355'), 'Date_2': None},
 {'Date_1': Timestamp('2016-04-04 15:50:40.794355'), 'Date_2': None},
 {'Date_1': Timestamp('2016-04-04 15:50:40.794355'), 'Date_2': None}]

然后遍历dicts列表(rows)并正常插入pyodbc。不需要任何SQL修改。