2011-05-03 4 views
20

Django의 데이터베이스에서 datetime 필드에 100 년을 빼거나 추가 할 수 있습니까? 어떻게 Django에서 데이터베이스의 datetime 필드에 100 년을 빼거나 추가 할 수 있습니까?

날짜

난 그냥 직접 계산 한 후 삽입 그것을 밖으로 검색하지 않고 필드를 업데이트 할 데이터베이스입니다.

+1

무엇을 의미합니까? 100 년 동안 데이터베이스의 모든 날짜를 수정 하시겠습니까? 날짜 + 100 년을 비교하는 쿼리를 작성 하시겠습니까? 100 년 추가 된 날짜를 출력하고 싶습니까? 뭐? –

+1

쓰기 뭔가 queryset.update 같은 (END_TIME = END_TIME + 1) – kelvinfix

답변

2

데이터베이스에서 Django datetime 필드의 값을 얻으면 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

당신이 d.timetuple'전에 별을 데려 가고 싶다는 생각()'. 또한'd'가 2000 년 2 월 29 일이나 2400 년 2 월 29 일에 결코 없었 으면 좋겠다 :-) –

+0

@Will : 당신은 두 가지 모두에있어 옳다. –

+0

두 개의 쿼리를 발행하고 동시 액세스에 안전하지 않습니다. – peufeu

8

사용 timedelta의 배수의 1 년 윤년 일 경우,이 완전히 실패합니다. 이런 식으로 뭔가 트릭을 수행해야합니다

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

장고 쿼리 세트에 .update() 방법을 사용하여 데이터베이스에서 개체를 검색하지 않고 모든 값을 업데이트 할 수 있습니다. F() object을 사용하여 기존 값을 참조 할 수 있습니다.

불행하게도 당신이 일에 표현 백년을 해결해야 할 것이다, 그래서 년 작동하지 않습니다 파이썬의 timedelta는 (그것의 36524.25) :

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

timedelta가있는 F() 객체를 참조하기 위해 Django 1.3 이상에서만 사용 가능합니다. –

+0

와우. 1.3 이전에는 작동하지 않았다는 것을 알지 못했습니다. –

+0

이것은, 윤년 일 2012-02-29처럼보다 효율적으로 사용하는'relativedate을 무시()'대신 timedelta'의()'당신은 내가 그'F()'객체 일 경우 매우 놀랄 것 정확성 – vdboor

42

내가 dateutil.relativedelta의 relativedelta 기능을 사용 당신이 계산 'N-년전'더 정확 줄 것이다 패키지 : 다른 사람이 여기에 표시된대로

from dateutil.relativedelta import relativedelta 
import datetime 

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

그런 다음 단순히 날짜 필드를 업데이트합니다.

+0

필자는이 패키지에 대해 들어 보지 못했습니다 (아직 시스템에 설치되어 있음). 설치를 생각해 보지 않으므로 다른 패키지에 포함되어 있는지 생각해보십시오. – Gerrat

+0

python-dateutil의 일부분입니다. – Max

+0

설치를 기억하지 못하는 패키지입니다. 내 답변을 찾았습니다. 아직 설치되지 않았다면 Matplotlib과 함께 설치됩니다. – Gerrat

0

나는 그것이 오래된 질문 알고,하지만 난 내 문제를 해결하기 위해 좋은 일을 찾을 수있는 문제를 가지고는, 나는이 만든 : 사용 플러스 (+) 또는 마이너스 (-)로 처리하는 :

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