Как я могу вычесть или добавить 100 лет в поле даты и времени в базе данных в Django? - PullRequest
33 голосов
/ 03 мая 2011

Как можно вычесть или добавить 100 лет к полю datetime в базе данных в Django?

Дата в базе данных, я просто хочу обновить поле, не извлекая его для вычисления, а затем вставить.

Ответы [ 5 ]

63 голосов
/ 03 мая 2011

Я бы использовал функцию относительной дельты пакета dateutil.relativedelta, которая даст вам более точный расчет 'n-летней давности':

from dateutil.relativedelta import relativedelta
import datetime

years_ago = datetime.datetime.now() - relativedelta(years=5)

Затем просто обновите поле даты, как показано здесь другими.

8 голосов
/ 03 мая 2011

Использование timedelta .Нечто подобное должно сработать:

import datetime
years = 100
days_per_year = 365.24
hundred_years_later = my_object.date + datetime.timedelta(days=(years*days_per_year))
6 голосов
/ 03 мая 2011

Метод .update() в наборе запросов Django позволяет обновлять все значения без извлечения объекта из базы данных. Вы можете обратиться к существующему значению, используя F() объект .

К сожалению, временная дельта Python не работает с годами, поэтому вам придется рассчитать 100 лет, выраженные в днях (это 36524.25):

MyModel.objects.update(timestamp=F('timestamp')+timedelta(days=36524.25))
2 голосов
/ 03 мая 2011

Когда вы получаете значение поля Django datetime из базы данных, оно появляется в виде объекта Python datetime.

Я думаю, что самый простой способ добавить 100 лет в PythonОбъект datetime выглядит так:

from datetime import datetime

d = datetime_object_from_database

d_plus_100_years = datetime(d.year + 100, *d.timetuple()[1:-2])

Затем сохраните его обратно в базу данных.Однако, как отмечается в комментариях, это полностью провалится, если дата является високосным днем ​​в году, кратным 400.

1 голос
/ 13 декабря 2017

Я знаю, что это старый вопрос, но у меня была проблема, чтобы найти хороший, чтобы решить мою проблему, я создал это: используйте плюс (+) или минус (-) для обработки:

import datetime # Don't forget to import it

def subadd_date(date,years):
    ''' Subtract or add Years to a specific date by pre add  + or - '''
    if isinstance(date,datetime.datetime) and isinstance(years,int):
        day,month,year = date.day , date.month , date.year
        #If you want to have HOUR, MINUTE, SECOND 
        #With TIME: 
        # day,month,year,hour,minute,second = date.day, date.month,date.year,date.hour,date.minute,date.second  

        py = year + years # The Past / Futur Year
        new_date_str = "%s-%s-%s" % (day,month,py) # New Complete Date
        # With TIME : new_date_str = "%s-%s-%s %s:%s:%s" % (month,day,py,hour,minute,second)
        try:
            new_date = datetime.datetime.strptime(new_date_str,"%d-%m-%Y")
        except ValueError: # day is out of range for month (February 29th)
            new_date_str = "%s-%s-%s" % (1,month+1,py) # New Complete Date : March 1st
            new_date = datetime.datetime.strptime(new_date_str,"%d-%m-%Y")

        return new_date
        # With TIME : return datetime.datetime.strptime(new_date_str,"%d-%m-%Y %H:%M:%Y")
    return None
...