timedelta-从字符串传递'days = -5'的最优雅方法

时间:2018-08-12 01:13:17

标签: python

我正在尝试调用一个函数,该函数会触发以小时或几天前的开始日期生成报告。下面的代码工作正常,但我想将timedelta偏移量存储在mysql数据库中。

starting_date = datetime.today() - timedelta(days=-5)

我希望将'days = -5'存储在数据库中,将该数据库列提取到变量'delta_offset'中,然后运行

starting_date = datetime.today() - timedelta(delta_offset)

它不喜欢这样,因为delta_offset是一个字符串。我知道我可以修改函数以仅在数据库中包含offset并存储-5,如下所示。但是我真的想在数据库中存储days = -5,因为我的偏移量也可以是几小时。我可以使数据库中的偏移量始终为小时,并在数据库中存储-120,但是我想知道是否存在一种优雅的方式在数据库中存储“ days = -5”而不会导致类型问题

starting_date = datetime.today() - timedelta(days=delta_offset)

2 个答案:

答案 0 :(得分:1)

您可以将'days=-5'分为两列,分别是“值”和“单位”或类似的列,而不是将unit = 'days' value = -5 starting_date = datetime.today() - timedelta(**{unit: value}) 存储在数据库中。 然后,您可以将它们通过字典传递给timedelta并解压缩。像这样:

timedelta([unit]=value)

这将解压缩字典,因此您得到的结果与'days=-5'相同。

或者,如果您确实想将'='保留为数据库中单个列的值,则可以在offset = 'days=-5' unit, value = offset.split('=') starting_date = datetime.today() - timedelta(**{unit: int(value)}) 上拆分字符串,然后采取类似的方法。方法如下:

yarn.lock

答案 1 :(得分:0)

我会这样:

    date_offset_split = date_offset.split("=")
    kwargs = {date_offset_split[0]: int(date_offset_split[1])}

    starting_date = datetime.today() - timedelta(**kwargs)