【问题标题】:Searching a date with parameter 'LIKE'使用参数“LIKE”搜索日期
【发布时间】:2018-12-22 17:18:58
【问题描述】:

我正在用 Python 和 SQlite 构建一个小程序,客户可以在其中键入 YYYY-MM-DD 格式的日期,然后取回在该特定日期发生的所有播放。所有播放都存储在 Play.db 中,日期保存为:YYYY-MM-DD HH:MM

我不希望用户输入带有小时和分钟的确切日期。他只需键入年月日,该特定日期的所有戏剧都会出现。

我意识到我需要关键字 'LIKE' 并在 '%'variable'%' 之间传递我的变量以获得相似(不完全)匹配。 但是我不确定如何使用我的 SQLite 查询的语法来做到这一点:

    user_input = input("Please, type the date of the play in format: 'YYYY-MM-DD':")
    search_date = """SELECT * FROM play WHERE play_date LIKE ? """
    cursor.execute(search_date, [(user_input)])
    results = cursor.fetchall()

问题在于“结果”未填充,因为 SQL 查询正在寻找完全匹配。

因此,我尝试使用 %user_input% 或 %?%,但是很明显,变量 '%user_input%' 或 %?% 没有定义。

我明白逻辑上应该怎么做:

how to search similar strings in SQLite

但我不确定如何使用我的代码语法获得“LIKE '%'variable'%'”。

【问题讨论】:

  • 你为什么要在标题中寻找演出日期
  • 对不起,我的错。我不小心弄错了。现在,我在原帖中修复了它。
  • 好吧,这更有意义。你应该可以做类似SELECT ... WHERE date(play_date) = ?
  • " 将日期保存为:YYYY-MM-DD HH:MM"Edit 您的问题并显示CREATE ... 语句。
  • 如果用户输入是YYYY-MM-DD 格式并且play_date 列中的时间是YYYY-MM-DD HH:MM 格式(或date and time functions 理解的任何其他格式),则 sn-p 将起作用.

标签: python sqlite


【解决方案1】:
import datetime
user_input = datetime.datetime(input("Please, type the date of the play in format: 'YYYY-MM-DD':"), '%Y-%m-%d')
# 2011-11-11
search_date = f'SELECT * FROM play WHERE play_date LIKE {user_input}'
print(search_date)
# SELECT * FROM play WHERE play_date LIKE 2011-11-11

这就是你要找的吗?

已编辑以防止 sql 注入

【讨论】:

  • 不要将不受信任的用户输入直接放入 SQL 语句中。这就是参数的用途。
  • @Shawn 你是对的。我试图辨别 FBSO 的要求。将 user_input 转换为 datetime.strptime(DATE, '%Y-%m-%d %H:%M:%S') 会更好
【解决方案2】:

在您的查询中使用date 函数来比较您存储的日期时间值和用户输入的日期。

SELECT * FROM play WHERE date(play_date) = date(?)

【讨论】:

  • 非常感谢。我还有一个小问题。如果我运行它,现在我得到错误'sqlite3.OperationalError: near "%": syntax error'。我不知道为什么。
  • 不需要通配符%。简单参数化用户输入。
  • 好的,我认为 % 对于 LIKE 关键字是必要的。如果我运行“SELECT * FROM play WHERE date(play_date) = date(user_input)”,我会收到错误“没有这样的列:user_input”。我很困惑,为什么要检查 Play.db 是否有 user_input 列?不是输入吗?。
  • 对不起,我的错。不需要通配符,只需使用 ? 占位符,它应该可以工作;) - 我已经更正了答案。
【解决方案3】:

你需要一个日期函数。您也可以对字符串使用切片。喜欢:

theDate = input() #example: 2018-12-24
Year = theDate[:3]
Month = theDate[5:6]
Day = theDate[8:9]

【讨论】:

    【解决方案4】:

    美好的一天, 好吧,它可能不是你想要的,但我会和你分享一些我在想构建这样的东西时写的代码,但这次使用的是 Flask 和 SQLAlchemy。

    首先是将数据转换为日期/日期时间,以确保数据有效

    converted_date = datetime.datetime.strptime(user_input, "%Y-%m-%d").date()
    

    转换成常规SQL查询应该是

    SELECT * FROM play WHERE play_date LIKE {"%" + converted_date}
    

    请注意"%"很重要,放在开头意味着你要搜索任何以输入日期开头的日期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      相关资源
      最近更新 更多