当前周,月,年的日期范围。蟒蛇/瓶

时间:2016-10-21 14:31:23

标签: python sqlalchemy

我在数据模型上有一个datefield(created_on),我试图过滤查询。我试图按当前过滤周,月,年。这不要与一个星期前,一个月前,去年相提并论。 (不取今天的日期并减去X daterange / timedelta以获得最后7,31,365天的价值)

例如:

当前周:如果是星期三7日,那么我想从星期一5日 - 星期日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)

1 个答案:

答案 0 :(得分:1)

在所有情况下,您都需要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包。它真的很简单,除了闰年,这超出了这个范围。除非你处理精确的时间(并进入时期限制或闰秒或时区或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)

在所有情况下,如果保证列的内容在过去(例如,如果它们是将行添加到表中的日期),则可以将上限替换为当前日期。或者也许是明天的,如果查询开始非常接近午夜,并且刚刚进入新的条目。