在过去12个月内,python jupyter notebook中要过滤的正确postgresql查询是什么?

nafvub8i  于 2023-02-08  发布在  PostgreSQL
关注(0)|答案(2)|浏览(96)

我正在jupyter notebook中使用python创建一个提取postgresql数据的查询。以前我只提取2022年的数据,但现在在2023年,我被要求提取过去12个月的数据。
为了提取2022年的数据,我使用了下面的代码,它的工作原理就像一个魅力。

cur = conn.cursor()
cur.execute('SELECT version()')

postgreSQL_select_Query = 
'SELECT car_id, "event", "position"
FROM cars.car_daily_data 
WHERE event like {}

cur.execute(postgreSQL_select_Query.format("'%2022%'"))
mobile_records = cur.fetchall()

然而,为了得到过去12个月的数据,我尝试了下面的代码,没有错误,但没有数据被检索。基本上返回一个空的 Dataframe 。

cur = conn.cursor()
cur.execute('SELECT version()')

postgreSQL_select_Query = 
'SELECT car_id, "event", "position"
FROM cars.car_daily_data 
WHERE case when POSITION({} IN event)>0 then to_timestamp(event, {}) else null end BETWEEN to_timestamp({},{}) AND to_timestamp({},{})
 
cur.execute(postgreSQL_select_Query.format("'-'",
"'YYYY-MM-DDXHH24:MI:SSX'",
"'2022-02-01 00:00'",
"'YYYY-MM-DD HH24:MI'",
"'2023-02-01 00:00'",
"'YYYY-MM-DD HH24:MI'"))
mobile_records = cur.fetchall()

我不知道我还能做什么,因为我真的不太使用postgresql。干杯。
我试过使用不同的代码和运算符,如〉,但它导致了错误。

t2a7ltrp

t2a7ltrp1#

此代码首先计算当前日期12个月前的日期,然后将其与当前日期沿着用作查询中的参数。这些参数作为元组传递给execute(),并在查询中指定正确的日期格式字符串。使用to_timestamp()函数将“event”字符串转换为时间戳。

import datetime

cur = conn.cursor()
cur.execute('SELECT version()')

now = datetime.datetime.now()
past_12_months = now - datetime.timedelta(days=365)

postgreSQL_select_Query = 
'SELECT car_id, "event", "position"
FROM cars.car_daily_data 
WHERE to_timestamp("event", \'YYYY-MM-DDXHH24:MI:SSX\') BETWEEN %s AND %s'

cur.execute(postgreSQL_select_Query, (past_12_months, now))
mobile_records = cur.fetchall()
atmip9wb

atmip9wb2#

如果你想要去年的daza,你不需要传递任何值给mix,但是如果你需要它,使用% s作为占位符的预准备语句

CREATE tABLE car_daily_data (car_id int , "event" varchar(20), "position" varchar(10))
CREATE TABLE
INSERT INTO car_daily_data VALUES ( 1, '2022-04-01', 'A')
, ( 2, NULL, 'B'),( 3, '2023-02-24 12:12:12', 'C')
INSERT 0 3
select '2023-02-01 00:00' :: timestamp - INTERVAL '1 YEAR'

| ?列?|
| - ------|
| 2022年2月1日00时00分|

SELECT 1
SELECT car_daily_data
 car_id, "event", "position"
FROM car_daily_data
WHERE "event" :: timestamp 
  BETWEEN  date_trunc('month', now()) ::TIMESTAMP  - INTERVAL '1 YEAR' AND date_trunc('month', now());

| 汽车标识|事件|位置|
| - ------|- ------|- ------|
| (2022年4月1日,A)|2022年4月1日|A类|

SELECT 1

fiddle

相关问题