인프런 커뮤니티 질문&답변

안녕하세요님의 프로필 이미지
안녕하세요

작성한 질문수

남박사의 파이썬으로 실전 웹사이트 만들기

게시판만들기 - 글 리스트

날짜 검색기능 관련해서 질문드립니다.

작성

·

597

1

기본적인 키워드 검색 이후에 날짜검색기능을 추가시키고 싶은데 프론트 엔드부분에서 

이렇게 검색을 받고 키워드와 마찬가지로 url_for 함수를 써서 백엔드 부분에 넘겼습니다.

몽고 DB에서 사용중인 UTCtime으로 변환해서 쿼리부분을 $and 후 pubtime에 대해서 lte,gte 검색을 해야할것같은데

이런식으로 넘어가서 형태변환을 어떻게 줘야할지 잘 모르겠습니다..ㅠㅠ 조언 부탁드립니다

답변 3

1

남박사님의 프로필 이미지
남박사
지식공유자

A 날짜와 B 날짜 사이의 데이터를 검색하기 위해서는 일단 A 날짜는 00:00:00 부터 시작하고 B 날짜는 23:59:59 초 까지를 범위로 하는게 좋을것 같습니다. 일단 이 부분부터 구현하면

    date_time_str1 = '2018-06-29' + ' 00:00:00'

    date_time_str2 = '2020-12-31' + ' 23:59:59'

넘어온 데이터가 문자열이니 일단 이렇게 단순하게 문자열 더하기를 해서 구현했습니다.

그리고 현재 데이터베이스에 utc 형태로 저장이 되어있으니 넘어온 날짜 역시 utc 형태로 변환을 해야하는데 물론 여러가지 편리한 라이브러리들이 있습니다만 강좌에선 사용하지 않았으니 강좌에서 사용한 코드를 그대로 사용해서 적용한다면...

offset = datetime.fromtimestamp(time.time()) - datetime.utcfromtimestamp(time.time())

위 코드를 그대로 사용해서 현재 utc 시간차이를 구해 offset 변수에 저장을 했습니다.

이제 위의 date_time_str1 과 2에 utc 시간차이를 더해줍니다.

(datetime.strptime(date_time_str1, '%Y-%m-%d %H:%M:%S') + offset

date_time_str1 은 문자열데이터기 때문에 일단 이를 datetime형태로 변환하기 위해 strptime 함수를 사용했고 인자로 date_time_str1 에 있는 날짜 스타일이 어떻게 생겼다고 알려줘야 합니다.(%Y-%m-%d %H:%M:%S) 그리고 그 결과에 offset을 더하면 우리가 최초 넘겨받은 문자열 데이터가 utc 시간을 적용하여 날짜 형식으로 변경되었습니다. 만약 질문의 예시처럼 단순히 날짜 문자열만 사용한다고 하면 

date_time_str1 = '2018-06-29'

(datetime.strptime(date_time_str1, '%Y-%m-%d') + offset

이렇게 하시면 날짜만 사용하게 됩니다만 실제 내부에서는 00:00:00 으로 자동 설정되게 됩니다.

이렇게 구한 datetime 형태를 몽고DB에 저장한 타임스탬프 형태로 변경을 해야 검색이 가능할테니 똑같이 아래처럼 해주면 됩니다.

date1 = round((datetime.strptime(date_time_str1, '%Y-%m-%d %H:%M:%S') + offset).timestamp() * 1000)

넘어온 문자열 데이터를 datetime으로 바꿔주고 여기에 utc offset을 더하고 이 전체를 타임스탬프형태로 변환해서 1000을 곱해 밀리세컨드를 세컨드로 변환하여 반올림 round() 해주면 몽고디비에 저장한 데이터 형태와 똑같이 됩니다. 이제 이를 활용하여 쿼리를 날리시면 됩니다.

    date_time_str1 = '2018-06-29' + ' 00:00:00'
    date_time_str2 = '2020-12-31' + ' 23:59:59'
    offset = datetime.fromtimestamp(time.time()) - datetime.utcfromtimestamp(time.time())
    date1 = round((datetime.strptime(date_time_str1, '%Y-%m-%d %H:%M:%S') + offset).timestamp() * 1000)
    date2 = round((datetime.strptime(date_time_str2, '%Y-%m-%d %H:%M:%S') + offset).timestamp() * 1000)

    print(date1, date2)
    board = mongo.db.board
    data = board.find({
        "pubdate": {
            "$gte": date1,
            "$lte": date2
        }
    })

    for d in data:
        print(d["_id"])

0

상세한 답변 정말 감사드립니다. 제가 html에서 좀 다르게 넘겼는지는 모르겠는데  -offset으로 하니까 0시부터 잘 나오네요
덕분에 해결완료했습니다!

0

board.py 코드입니다

안녕하세요님의 프로필 이미지
안녕하세요

작성한 질문수

질문하기