2016-01-05 150 views
0

我看了一下那个链接两个日期之间的SQALCHEMY查询

这很奇怪,因为查询即时操作是命中而错过。 它不能显示的日期,如果不同的是只有几天

SQLAlchemy: how to filter date field?

型号:

class UserCallsModel(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    date = db.Column(db.String(90)) 
    username = db.Column(db.String(90)) 
    event_name = db.Column(db.String(90)) 

查询:

users = UserCallsModel.query.filter(UserCallsModel.date.between("2016-1-1", "2016-1-20")).order_by(UserCallsModel.date.desc()) 

我有2个日期是落在这个范围内,但没有被查询?

+0

有没有时间组件到你的日期范围?日期默认为'00:00:00' – HoneyBadger

+0

您的日期字段实际上是一个字符串吗?如果是这样,数据库可能无法正确比较日期,而是将它们作为字符串进行比较。例如,“2016-01-05”不是“您”指定的两个“日期”之间,也不是“2016-1-6”。 –

+0

@MarkHildreth 所以我将不得不使用日期时间对象我想这是我的数据类型是错的?我在印象之下,它实际上能够解析它,因为在帖子中的链接 – Zion

回答

2

我对MySQL并不熟悉,但我想它与我在下面输出的PG相同。

当您使用方法“之间”,你最终使用“BETWEEN”运算符,就像这样......

SELECT * FROM my_table WHERE date BETWEEN '2016-1-1' AND '2016-1-20' 

的问题是,“与”操作不不同的日期与事字符串。例如,如果它正在测试的值是一个字符串,它会将参数('2016-1-1' AND '2016-1-20'部分)看作字符串。

mhildreth=# select '2016-1-5' between '2016-1-1' AND '2016-1-10'; 
?column? 
---------- 
f 
(1 row) 

同时,如果它检测值是一个日期对象,那么它会隐含的字符串转换为Date对象,基本上从事下列...

mhildreth=# select '2016-1-5'::date between '2016-1-1'::date AND '2016-1-10'::date; 
?column? 
---------- 
t 
(1 row) 

因此,我的猜测是你想要将你的“日期”列转换为日期类型。如果您必须将其保留为字符串,那么您需要确保使用的日期格式在进行字符串比较时也适用。因此,您需要2016-01-01而不是2016-1-1

+0

将日期转换为日期对象是写我现在就能够工作。 但是,将字符串格式化为“yyyy-mm-dd”而不是“yyyy-m-d”可能是日期关闭的原因。我会试试看 – Zion

0

我的印象是,只要字符串具有某种格式,字符串实际上会被正确查询。但不是,我恐怕不是这样。

这样做,如果你有此格式字符串的一种更好的方式: "2016-1-5"是简单地将字符串日期转换为datetime.date对象

蟒蛇3

import datetime 
splitted_date = [int(number) for number in "2016-1-5".split("-")] 
formatted_date = datetime.date(*splitted_date) 
相关问题