2017-11-18 4 views
0

日付の期間内にレコードを選択したいと思います。ただし、データベースの対応するデータ型は '2017-11-13-05-36-25'のようになります。私はdatetime形式に変換する必要があります。SQLクエリでdatetimeを変換する

Error: ('42S22', "[42S22] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Invalid column name '2017-10-8 00:00:00'. (207) (SQLExecDirectW)") 

がどのように正しい結果を得ることができます。

connection = pyodbc.connect("Driver={\ 
ODBC Driver 13 for SQL Server};\ 
Server=server1,\ 
100;Database=my_db;\ 
Uid=abc;\ 
Pwd=123;\ 
Encrypt=yes;\ 
TrustServerCertificate=no;\ 
Connection Timeout=30;") 

cmd = r'SELECT startDate FROM table1 where \ 
CONVERT (datetime, startDate, 120) between \ 
CONVERT(datetime, "2017-10-8 00:00:00", 120) and \ 
CONVERT(datetime,"2017-11-7 00:00:00", 120)' 

a = pd.read_sql(cmd, con = connection) 

が実行された後、私は次のエラーを受け取った次のSQLクエリはpyodbcを使用して作られるのですか?

答えて

2

文字列リテラルは、デフォルトでSQL Serverの単一引用符で区切られています。二重引用符は、列名やオブジェクト名などの識別子を示します。

"2017-10-8 00:00:00"の代わりに、'2017-10-8 00:00:00'を使用し、"2017-11-7 00:00:00"を使用してください。

これにより、受信したエラーが修正されます。

Invalid column name '2017-10-8 00:00:00'

CONVERT (datetime, startDate, 120)は仕方によってクエリがunsargableようになります。その列に対してインデックス範囲シークを実行することはできません。 startDateは、実行時に変換する必要がないような適切なデータ型(date/datetime/datetime2)を使用する必要があります。

+0

ありがとう、マーティン。 startDateのある期間を選択したいと思います。私はデータベーステーブルのデータ型を変更できない場合、それを行う方法はありますか? – Mandy