簡體   English   中英

Python:SQL 服務器使用日期時間插入多個值(從字符串轉換日期和/或時間時轉換失敗)

[英]Python: SQL Server insert multiple values with datetime (Conversion failed when converting date and/or time from character string)

我正在嘗試在 python 的數據庫表(SQL 服務器)中插入多行:

def write_to_database(values):
    conn =  pyodbc.connect("Driver={SQL Server};"
                        "Server=xxxx.database.windows.net;"
                        f"Database={database};"
                        "UID=user;"
                        "PWD=password;")
    cursor = conn.cursor()
    cursor.executemany("insert into KeyFigures (DateTime, Parameter, CommulativeTime, Value) values (?,?,?,?)", values)
    conn.commit()
    return()

date = datetime.datetime.now()
atom = date.strftime("%Y-%M-%d") + " " + date.strftime("%H:%M:%S") + ".4526800"

values = ([datetime.datetime.now().isoformat(), 1, "NULL", 2],[datetime.datetime.now().isoformat(), 1, "NULL", 47],[datetime.datetime.now().isoformat(), 1, "NULL", 78])

write_to_database(values)

我嘗試了多種格式的日期時間、字符串組合等,例如:

datetime.datetime.now().isoformat() 
atom
"2020-02-23 11:30:53.4526800"
"2020-02-23T11:30:53.4526800" 

但我一直收到同樣的錯誤:

line 50, in write_to_database
    cursor.executemany("insert into KeyFigures (DateTime, Parameter, CommulativeTime, Value) values (?,?,?,?)", values)
pyodbc.DataError: ('22007', '[22007] [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting date and/or time from character string. (241) (SQLExecDirectW)')

在 SSMS 中,以下工作:

INSERT INTO KeyFigures (DateTime, Parameter, CommulativeTime, Value) VALUES ('2020-02-23 11:30:53.4526800',2,null,21)

我該如何解決這個錯誤?

***** 編輯 ****

@Mogo 非常感謝。 這已經很有幫助,但在我的代碼中不起作用。 我仍然收到同樣的錯誤。 我還嘗試插入一行,並且這段代碼有效(使用 execute 而不是 executemany):

def write_to_database(date,parameter,cummulativeTime,value):
    conn = pyodbc.connect("Driver={ODBC Driver 17 for SQL Server};"
                        "Server=xxxx.database.windows.net;"
                        f"Database={database};"
                        "UID=user;"
                        "PWD=password;")
    with conn.cursor() as cursor:
        cursor.execute(f"INSERT INTO dbo.KeyFigures (DateTime, Parameter, CommulativeTime, Value) values ('{date}',{parameter},{cummulativeTime},{value})")
        conn.commit()
    return()


date = datetime.datetime.now()

write_to_database(date, 1, "NULL", 43)

如果沒有引號之間的日期,它就不起作用。 這也是executemany的問題嗎? 當我在 qoutes ('?' 或 '?') 之間加上問號時,給出的錯誤是只給出了 3 個參數而不是 4 個。

正如我在評論中提到的,如果您使用強類型數據類型(所以不要將其轉換為字符串),python 和 pyodbc 會很好地處理這個問題。 但是,我還建議更新到SQL 服務器的 ODBC 驅動程序,而不是使用舊的本機 SQL 服務器驅動程序。 我還將 cursor 放入with中,使其優雅地關閉。

對於我使用下面的定義創建的表,這工作正常,並插入了 2 行,具有正確的日期和時間值:

CREATE TABLE dbo.TestDateTable (i int,dt datetime2(7));
import datetime, pyodbc

def write_to_database(values):
    conn = pyodbc.connect("Driver={ODBC Driver 17 for SQL Server};"
                          "Server=xxxx.database.windows.net;"
                          "Database={database};"
                          "UID=user;"
                          "PWD=password;")
    with conn.cursor() as cursor:
        cursor.executemany("INSERT INTO dbo.TestDateTable (i,dt) VALUES (?,?);", values)
        conn.commit()
    return()

date = datetime.datetime.now()
values = ([1,date],[2,date])

write_to_database(values)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM