两个日期之间的SQALCHEMY查询

时间:2016-01-05 15:15:42

标签: python mysql sql sqlalchemy flask-sqlalchemy

我看了那个链接

这很奇怪,因为我正在做的查询是命中和错过。 如果差异仅为几天,则无法显示日期

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个日期属于这个范围但未被查询?

2 个答案:

答案 0 :(得分:2)

我不熟悉MySQL,但我想它和PG一样,我在下面列出了输出。

当你使用“between”方法时,你最终会使用“BETWEEN”运算符,就像这样......

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

问题是“between”运算符对日期与字符串做了不同的事情。例如,如果它正在测试的值是一个字符串,它会将参数('2016-1-1' AND '2016-1-20'部分)视为字符串。

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

同时,如果它正在测试的值是一个日期对象,那么它将隐式地将字符串转换为日期对象,基本上执行以下操作...

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

答案 1 :(得分:0)

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

如果你有这样格式的字符串,这是一个更好的方法: "2016-1-5"只是将字符串日期转换为datetime.date对象

python 3

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