私はSQL ServerデータベースからOracleデータベースにデータを移動するプロジェクトに取り組んでいます。日付は苦労しています。データの移動を行うために、私は、SQL Serverデータベースからデータを取り出し、挿入クエリを実行するpythonスクリプトを用意しています。sqlserver datetimeからoracleタイムスタンプの問題
問題は、日付はこの2016-06-01 05:45:06.003
のように見えるが、私は小数秒を落とした場合、それはそれでミリ秒を持っている必要がありますので、そこにレコードのたくさん2016-06-01 05:45:06
であるだけ2016-06-01 05:45:06.003
1つとして、それが主キーに違反するということです。私はちょうどレコードを引き、ちょうどこのVALUES(:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15)
のような値を持つ基本的な挿入が得ることをやっている私の挿入を実行する場合、Oracleの列のためのデータ型はTIMESTAMP
で言及する必要があり
私の日付は01-JUN-16 07.05.41.000000000 AM
のようになります。これは問題ありませんが、1レコードごとに分秒が000000であるため、精度が失われてプライマリキーに違反してしまいます。
私は、修正プログラムがフォーマットについて明示的であるように思ったので、挿入文の値節をこのように変更しました。VALUES(TO_TIMESTAMP(:1, 'YYYY-MM-DD HH24:MI:SS,FF9'), :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15)
。これはすべての行のすべての日付を16-JUN-20 12.00.00.000000000 AM
に変更するとさらに悪化します。私もYYYY-MM-DD HH24:MI:SS,FF9
を試しましたが、これは同じ結果をもたらします。
私はこの愚かなものを私が逃していると確信していますが、私の人生では何か分かりません。
SQL Serverテーブルの列のデータ型はDateTime
で、Oracleサーバーでは現在TimeStamp(3)
に設定されていますが、Oracle側でデータ型を変更できます。
私はcx_oracleを使用して挿入を接続して実行しています。私は、挿入が実行される前にデータがミリ秒を持っていることを確認することができます。
のpython:
def RunQuery():
srccrsr.execute(query)
return srccrsr.fetchall()
def RunQuery():
srccrsr.execute(query)
return srccrsr.fetchall()
def BuildBindList(recordsToWrite):
closingRecords = []
for rec in recordsToWrite:
closingRecords.append((rec[0], rec[1], rec[2], rec[3], rec[4], rec[5], rec[6], rec[7], rec[8], rec[9], rec[10], rec[11], rec[12], rec[13], rec[14]))
return closingRecords
def write_to_table(recordsToWrite):
SQL = """INSERT INTO TRACE (DATETIME, ID, TZ, DOMAINID, EVENTNAME, REASONCODE, TARGETID, STATE, KEY, PERIPHERALKEY, RECOVERYKEY, DIRECTION, ROUTERDAY, ROUTERCKEY, ROUTERNUMBER)
VALUES(TO_TIMESTAMP(TO_CHAR(:1), 'yyyy-mm-dd hh24:mi:ss.ff3'), :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15)"""
try:
trgtcrsr.prepare(SQL)
except cx_Oracle.DatabaseError, exception:
print ('Failed to prepare cursor')
print Exception(exception)
exit (1)
try:
trgtcrsr.executemany(None, recordsToWrite)
except cx_Oracle.DatabaseError, exception:
print ('Failed to insert rows')
print Exception(exception)
exit (1)
trgtcnn.commit()
trgtcnn.close()
source_connection.close()
def main():
recordstowrite = BuildBindList(RunQuery())
write_to_table(recordstowrite)
if __name__ == "__main__":
main()
まず、Pythonスクリプトで取得したデータにミリ秒のデータがあることを確認しましたか? Pythonスクリプトは値を文字列値またはタイムスタンプとして格納していますか? – MT0
これはSQL ServerやOracleとはほとんど関係がありませんが、タイムスタンプをプライマリキーとして使用するのは良い考えではありません。いずれの場合でも、日付はフォーマットを持たず、バイナリ値です。それらをテキストに変換せずにパラメータ化されたクエリを使用する場合、あるデータベースから別のデータベースにそのまま値を渡すことができます。どのライブラリを使用していますか? –
私はそれが良い考えではないことを十分に認識しています。しかし、私は安価な協同組合で、彼らはそれを変更したくありません。キーには他の列があります。 – user5999614