【问题标题】:SqlAlchemy SQLServer and the date() functionSqlAlchemy SQLServer 和 date() 函数
【发布时间】:2021-09-24 13:15:32
【问题描述】:

我在 sqlAlchemy 中有这段代码:

result = session.query(FXHoliday).where(
           and_(
              FXHoliday.country_region_code == country, 
              func.DATE(FXHoliday.event_date) == when.date()
           )
         ).all()

现在这个函数像魅力一样工作,但在 sqlserver :( ...

上面的函数是翻译在

 SELECT [FX_HOLIDAY].countryorregion AS [FX_HOLIDAY_countryorregion],      
        [FX_HOLIDAY].holidayname AS [FX_HOLIDAY_holidayname], 
        [FX_HOLIDAY].normalizeholidayname AS [FX_HOLIDAY_normalizeholidayname], 
        [FX_HOLIDAY].ispaidtimeoff AS [FX_HOLIDAY_ispaidtimeoff], 
        [FX_HOLIDAY].countryregioncode AS [FX_HOLIDAY_countryregioncode],       
        [FX_HOLIDAY].date AS [FX_HOLIDAY_date]

 FROM [FX_HOLIDAY]

 WHERE [FX_HOLIDAY].countryregioncode = ? 
       AND 
       DATE([FX_HOLIDAY].date) = ?

而且是正确的,但是 sqlserver 中没有 DATE()。 我可以解决制作日期列 varchar 的问题,以便我可以使用:

  FXHoliday.event_date == when.strftime("%Y-%m-%d")

但这确实是一个丑陋的解决方案。 我想知道是否某些开发人员找到了更好、更优雅的解决方案....

【问题讨论】:

    标签: sql-server sqlalchemy orm


    【解决方案1】:

    我相信您正在尝试确保 datetime 对象(我假设 when 是)被解释为 date

    为此有一个 sqlalchemy 函数:

    from sqlalchemy import func
    
    result = session.query(FXHoliday).where(
               and_(
                  FXHoliday.country_region_code == country, 
                  FXHoliday.event_date == func.date(when)
               )
             ).all()
    

    虽然您在第一部分使用 func.DATE,但两者都使用它。

    更新:我认为您正在尝试将预先存在的 DATE 列转换为 DATE,但您真正想要转换的是 pythonic 对象。

    【讨论】:

    • sqlalchemy 提供的 date() 函数只从日期/日期时间字段中提取日期。 SQLserver 不像其他 RDBMS 那样有这样的功能。最佳匹配是 sqlserver 的 convert() 函数,但是它需要原始 date() 中不需要的额外参数。我确定 func.DATE() 不能在 sqlserver 方言中映射为 DATE()。我也明白了你的意思,也许 func.date(when) 比 when.date() 更好。
    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 2017-07-31
    • 2017-11-16
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多