63 votes

Comment puis-je soustraire ou ajouter 100 ans à un champ datetime dans la base de données de Django ?

Comment puis-je soustraire ou ajouter 100 ans à un datetime dans la base de données de Django ?

La date est dans la base de données, je veux juste mettre à jour directement le champ sans le récupérer pour le calculer puis l'insérer.

106voto

Max Points 2763

J'utiliser le relativedelta en fonction de la dateutil.relativedelta package, ce qui vous donnera êtes calcul plus précis « il y a n ans »:

 from dateutil.relativedelta import relativedelta
import datetime

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

Ensuite, mettez simplement à jour le date comme d'autres l'ont montré ici.

15voto

Vladimir Prudnikov Points 2106

Utilisez timedelta . Quelque chose comme ça devrait faire l'affaire :

 import datetime
years = 100
days_per_year = 365.24
hundred_years_later = my_object.date + datetime.timedelta(days=(years*days_per_year))

6voto

Will Hardy Points 6663

La .update() sur un ensemble de requêtes Django vous permet de mettre à jour toutes les valeurs sans récupérer l'objet de la base de données. Vous pouvez vous référer à la valeur existante à l'aide d'un objet F() .

Malheureusement, le timedelta de Python ne fonctionne pas avec les années, vous devrez donc calculer 100 ans exprimés en jours (c'est 36524.25):

 MyModel.objects.update(timestamp=F('timestamp')+timedelta(days=36524.25))

1voto

Lemayzeur Points 5197

Je sais que c'est une vieille question, mais j'ai eu le problème d'en trouver une bonne pour résoudre mon problème, j'ai créé ceci : utilisez plus(+) ou moins(-) pour gérer avec :

 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X