2011-05-03 16 views
20

Django'da veritabanında datetime alanına 100 yıl nasıl çıkartabilirim veya ekleyebilirim?Django'daki veritabanında datetime alanına 100 yıl nasıl çıkartabilirim veya ekleyebilirim?

Veritabanında veritabanı var, ben sadece hesaplamak ve daha sonra eklemek için onu almaksızın alanı doğrudan güncellemek istiyorum.

+1

Ne demek istiyorsun? Veritabanındaki tüm tarihleri ​​100 yıl boyunca değiştirmek ister misiniz? Tarihi + 100 yılı karşılaştıran bir sorgu yazmak ister misiniz? Sadece 100 yıllık tarihler eklemek ister misiniz? Ne? –

+1

gibi bir şeyler yazın queryset.update (end_time = end_time + 1) – kelvinfix

cevap

2

Veritabanından Django datetime alan değerini aldığınızda, bir Python datetime nesnesi biçiminde gelir.

from datetime import datetime 

d = datetime_object_from_database 

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

Sonra geri veritabanına kaydetmek:

Ben bir Python datetime nesnesine 100 yıl eklemenin en kolay yolu böyle olduğunu düşünüyorum. Yine de yorumlarda belirtildiği gibi, bu tarih, bir yıl içinde geçen bir gün olan bir sıçrama günüyse, tümüyle başarısız olur.

+1

Sanırım d.timetuple() 'dan önce bir yıldız koymak istersiniz. Ayrıca, d um ümit edelim asla 29 Şubat 2000 veya 29 Şubat 2400 :-) –

+0

@Will: Her iki sayımda da haklısınız. –

+0

Bu iki sorgular yayınlar ve eşzamanlı erişim için güvenli değildir. – peufeu

8

timedelta'u kullanın. Böyle bir şey hile yapmak gerekir:

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

Django sorgu sette .update() yöntem veritabanından nesne alma olmadan tüm değerleri güncelleştirmek sağlar. F() object kullanarak mevcut değere başvurabilirsiniz.

Ne yazık ki günlerde ifade 100 yıl çalışmak gerekecek, bu yüzden yıllardır çalışmaz Python'un timedelta (öyle 36.524,25):

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

Sadece zaman dilimi ile F() nesnelerinin kullanıldığı gibi kullanmak için bu sadece Django 1.3 veya daha sonraki sürümlerde kullanılabilir. –

+0

Wow, 1.3'ten önce çalışmadığı konusunda hiçbir fikrim yoktu. –

+0

Bu, 2012-02-29 gibi sıçrama günlerini göz ardı eder, daha iyi kullanmak 'relativedate()' 'timedelta()' yerine – vdboor

42

Ben dateutil.relativedelta ait relativedelta işlevini kullanırsınız Eğer hesaplama 'n yıl önce' daha doğru verecektir paketi: diğerleri burada gösterdiği gibi

from dateutil.relativedelta import relativedelta 
import datetime 

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

Sonra sadece tarih alanını güncelleyin.

+0

Bu paketi hiç duymadım (henüz sistemimde yüklü). Bunu yüklemeyi hatırlamıyorum, başka bir pakette bir şekilde var mı diye bir fikrin var mı? – Gerrat

+0

Python-dateutil'in bir parçası – Max

+0

Bu, yüklemediğim paket değil. Cevabımı buldum - zaten yüklü değilse Matplotlib ile birlikte yüklenir. – Gerrat

0

Ben eski bir soru bilin, ama benim sorunu çözmek için iyi bir tane bulmak için sorun vardı, bu yarattık: Kullanım artı (+) veya eksi (-) ile işlemek için:

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 
İlgili konular