繁体   English   中英

当前星期,月份,年份的日期范围。 Python /烧瓶

[英]Date range of current week, month, year. Python/Flask

我在试图过滤查询的数据模型上有一个datefield(created_on)。 我试图按当前星期,月份,年份进行过滤。 请勿将其与去年的一周前,一个月前相混淆。 (不采用今天的日期,并减去X daterange / timedelta以获得最后7、31、365天的价值)

例如:

当前周:如果星期三是7日,那么我想从5月1日至11日进行过滤。

当前月份(如果是2月16日),我想在2月1日至2月29日之前进行过滤。

当年如果是2016年3月3日,我想过滤2016年1月1日至2016年12月31日。

语音示例:

.filter(Table.created_on BETWEEN FIRST AND LAST DAY OF THIS WEEK/MONTH/YEAR)

在所有情况下,您都希望LOWER_BOUND < Table.created_on < UPPER_BOUND 可能需要将其分为两部分,不确定sqlalchemy是否可以自动执行该操作。

当前一周,您需要减去0到6天(具体取决于一周中的星期几)来获得下限,将0到6之间相加即可获得上限。

当前月份,找到当前月份和年份,下限为YEAR-MONTH-01,上限为YEAR-MONTH-DAYS_IN_MONTH。

本年度,下限为YEAR-01-01,上限为YEAR-12-31。

要获取此信息,请尝试使用标准库中的datetime包。 除了leap年之外,这确实很简单。 除非您处理精确的时间(遇到纪元限制或seconds秒或时区或DST)或“ N个月/年前”(在这种情况下,您必须处理“ 1个月之前12月31日”,“ 2月29日之前的1年”等)。 只要您不使用可变持续时间(例如,几个月或几年)作为单位,并且您不需要精确的时钟时间,那么就可以安全地将天数视为单位,甚至不涉及任何算术运算。

# In all
from datetime import date, timedelta
today = date.today()

然后,在一周内:

weekday = today.weekday()
# lower bound
mon = today - timedelta(days=weekday)
# upper bound
sun = today + timedelta(days=(6 - weekday))

对于月份:

days_per_month = {1: 31, 2: 29, 3: 31, ...} # you can fill this in yourself
# lower bound
first = today.replace(day=1)
# upper bound
try:
    last = today.replace(day=days_per_month[today.month])
except ValueError:
    if today.month == 2:  # Not a leap year
        last = today.replace(day=28)
    else:
        raise  # just to be safe, in case there's some other error I missed

而对于一年:

# lower bound
janfirst = today.replace(month=1, day=1)
# upper bound
declast = today.replace(month=12, day=31)

在所有情况下,如果保证列的内容是过去的(例如,如果它们是将行添加到表中的日期),则可以用当前日期替换上限。 也许是明天的查询,如果查询从午夜开始很近,之后又有新的条目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM