【问题标题】:How to select all rows from a table which match a given date/date condition?如何从表中选择与给定日期/日期条件匹配的所有行?
【发布时间】:2019-12-17 02:23:21
【问题描述】:

我认为满足语法要求并且已经尝试了很多......

我已经设置了后续变量:

db_uri = "postgres://{}:{}@{}/{}".format(user, pwd, server, db)
engine = create_engine(db_uri)
con = engine.connect()

已经有效的方法:

df_sql = pd.read_sql_table('TABLE', engine)

什么也有效:

 query = 'SELECT * FROM "TABLE" WHERE id_column = 12564993'
 df = pd.read_sql_query(query, con)

但是当我将 id_column 更改为 date_column 时,就没有任何效果了:

query = 'SELECT * FROM "TABLE" WHERE CAST(ts_column as date) = ts_column "2019-06-19"'
df = pd.read_sql_query(query, con)

独立于所有可用的语法选项,我得到一个错误代码:

ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near ""2019-06-19""
LINE 1: ...LECT * FROM "TABLE" WHERE CAST(ts_column as date) = ts_column "2019-06-1...

“2019-06.1”的“下方有一个 ^...知道要修复什么吗?我查阅了文档并搜索了任何类型的条件 where 语句主题,但我仍然不明白。为什么我不能只选择特定的日期属性来获取匹配的行?

【问题讨论】:

  • 双引号用于带引号的标识符,而不是文字。使用单引号。另外,为什么要在文字前面加上列名 (ts_column)?
  • 由于我将该 SQL 语句保存在一个变量中,因此我必须在开头和结尾都使用 '。当我在两者之间使用 ' 时,它会破坏我的陈述。我的表名也是大写的。如果要在 select 语句中使用大写的表,则必须使用 " 而不是 none 或 '。
  • 请先声明您的 Postgres 版本和您的实际表定义(CREATE TABLE 声明)。
  • 要么转义 SQL 语句中 Python 字符串文字中的单引号,要么使用三引号(在 Python 中)。
  • @Christian:你可以通过\d "TABLE" 获取psql中的相关信息。 (而且不要使用“TABLE”作为表名。永远。stackoverflow.com/a/20880247/939860

标签: python sql pandas postgresql sqlalchemy


【解决方案1】:

这是什么类型的语法?

WHERE CAST(ts_column as date) = ts_column "2019-06-19"'

你可以这样写:

WHERE CAST(ts_column as date) = '2019-06-19'

或者在 Postgres 中更通俗地说是:

WHERE ts_column::date = '2019-06-19'::date

【讨论】:

  • 因为我声明了一个包含查询字符串的变量,所以我必须使用:'。 WHERE CAST(ts_column as date) = '2019-06-19':引发语法错误。以及你最后的建议。这就是我使用 "的原因。使用 ' 会破坏我的字符串声明。
  • @Christian 。 . .这两个在 Postgres 中都能正常工作。你确定你使用的是 Postgres 吗?事实上,第一个应该适用于几乎任何数据库。
  • 是的,它绝对是 Postgres :D
【解决方案2】:

谢谢,后续定义正在起作用:

query = '''SELECT * FROM "TABLE" WHERE ts_date::date = date '2019-06-19' '''
query = '''SELECT * FROM "TABLE" WHERE ts_date::date = '2019-06-19' '''

所需语法:

  1. 表名必须用双引号括起来,因为表名是 100% 大写的。单引号在这里不起作用。我在某个地方找到了它,但现在找不到链接了。抱歉。
  2. 语句本身的三引号似乎是唯一可靠的变体。
  3. 日期属性的三引号和单引号之间必须有一个空格。没有空格,查询将不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多