web-dev-qa-db-fra.com

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

Comment soustraire ou ajouter 100 ans à un champ datetime dans la base de données dans 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.

34
kelvinfix

J'utiliserais la fonction relativedelta du paquet dateutil.relativedelta, qui vous donnera un calcul plus précis il y a 'n-années':

from dateutil.relativedelta import relativedelta
import datetime

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

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

64
Max

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))
9

La méthode .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 F() objet .

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

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

Lorsque vous obtenez la valeur d'un champ Django datetime de la base de données, il se présente sous la forme d'un Python datetime objet.

Je pense que la façon la plus simple d'ajouter 100 ans à un objet Python datetime est comme ceci:

from datetime import datetime

d = datetime_object_from_database

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

Enregistrez ensuite cela dans la base de données. Comme indiqué dans les commentaires, cela échouera complètement si la date est un jour bissextile dans une année qui est un multiple de 400.

2
Paul D. Waite

Je sais que c'est une vieille question, mais j'ai eu le problème pour 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
1
Lemayzeur