【问题标题】:Getting a syntax error when trying to execute this SQL query in Python尝试在 Python 中执行此 SQL 查询时出现语法错误
【发布时间】:2022-01-16 23:41:18
【问题描述】:

我正在尝试让脚本自动将查询开始时间设置为昨天早上 6 点(一旦我找出开始时间错误,就会将结束时间设置为今天早上 6 点)但我收到语法错误(102, b“'06'附近的语法不正确。DB-Lib 错误消息 20018,严重性 15:\n一般 SQL Server 错误:检查来自 SQL Server 的消息\n”)。

如果我取出 """+StartTime+""" 并更改为 '20211212 07:00:00.000' 那么它可以工作,但我需要一种方法让脚本跟踪当前日期而不是返回每天都在变化。

from datetime import timedelta
import numpy as np
from pandas import DataFrame 
import pandas as pd
import pymssql


from datetime import date, timedelta
today = date.today()
yesterday = today - timedelta(days = 1)

BEGINDATE=yesterday
ENDDATE=today
BEGINDATE=BEGINDATE.strftime("%Y%m%d")
ENDDATE=ENDDATE.strftime("%Y%m%d")
StartTime = BEGINDATE +' 06:00:00:000'
print(StartTime)

Query= """SET NOCOUNT ON
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
SET @StartDate = """+StartTime+"""
SET @EndDate = '20211213 07:00:00.000'
SET NOCOUNT OFF
SELECT temp.TagName ,DateTime ,Value ,vValue ,MinRaw = ISNULL(Cast(AnalogTag.MinRaw as VarChar(20)),'N/A') ,MaxRaw = ISNULL(Cast(AnalogTag.MaxRaw as VarChar(20)),'N/A') ,Unit = ISNULL(Cast(EngineeringUnit.Unit as VarChar(20)),'N/A') ,StartDateTime From (
    SELECT  * 
     FROM History
     WHERE History.TagName IN ('S03_FT03_04_TOT01')
     AND wwRetrievalMode = 'Cyclic'
     AND wwCycleCount = 1440
     AND wwVersion = 'Latest'
     AND DateTime >= @StartDate
     AND DateTime <= @EndDate) temp
LEFT JOIN AnalogTag ON AnalogTag.TagName =temp.TagName
LEFT JOIN EngineeringUnit ON AnalogTag.EUKey = EngineeringUnit.EUKey
 WHERE temp.StartDateTime >= @StartDate"""
cur.execute(Query)
print(Query)

【问题讨论】:

  • 您的StartTime 周围缺少引号。
  • @KlausD。在查询内部?它不应该留在引号之外,因为它是一个变量吗?
  • 在执行之前打印出Query 并比较@StartDate 和@EndDate 行。
  • 啊,明白了,它现在可以工作了。谢谢

标签: python sql


【解决方案1】:

考虑在不声明@ 参数的情况下将Python 中的运行参数化传递到准备好的SQL 语句中。此外,将所有变量保留在日期时间中,而不进行任何字符串转换。

由于上午 6 点和上午 7 点的混淆,不太确定您的日期范围需要什么,下面计算从昨天上午 6 点到今天上午 5:59:59 的范围(24 小时)。根据需要进行调整。最后,最终的WHERE 被移动到子查询中。

from datetime import datetime, date, timedelta
import numpy as np
from pandas import DataFrame 
import pandas as pd
import pymssql

BEGINDATE = datetime.combine(
    date.today() - timedelta(days = 1), datetime.min.time()
) + timedelta(hours = 6)
print(BEGINDATE)
# 2021-12-12 06:00:00

ENDDATE = BEGINDATE + timedelta(days = 1) - timedelta(seconds=1)
print(ENDDATE)
# 2021-12-13 05:59:59

### PREPARED STATEMENT WITH %s PLACEHOLDERS
Query= """SELECT temp.TagName 
                , [DateTime] 
                , [Value] 
                , vValue  
                , MinRaw = ISNULL(CAST(AnalogTag.MinRaw AS VARCHAR(20)), 'N/A')
                , MaxRaw = ISNULL(CAST(AnalogTag.MaxRaw AS VARCHAR(20)), 'N/A') 
                , Unit = ISNULL(CAST(EngineeringUnit.Unit AS VARCHAR(20)), 'N/A')
                , StartDateTime 
          FROM (
              SELECT  * 
              FROM History
              WHERE History.TagName IN ('S03_FT03_04_TOT01')
                AND wwRetrievalMode = 'Cyclic'
                AND wwCycleCount = 1440
                AND wwVersion = 'Latest'
                AND [DateTime] >= %s
                AND [DateTime] <= %s
                AND StartDateTime >= %s
          ) temp
          LEFT JOIN AnalogTag ON AnalogTag.TagName = temp.TagName
          LEFT JOIN EngineeringUnit ON AnalogTag.EUKey = EngineeringUnit.EUKey
       """

# RUN QUERY WITH PARAMETERS
cur.execute(Query, [BEGINDATE, ENDDATE, BEGINDATE])
print(Query)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    相关资源
    最近更新 更多