Language/Python

[Django] 날짜 조건별로 테이블에 저장된 첫번째 값 / 마지막 값 구하기

도토리즈 2023. 7. 17. 21:01
from datetime import datetime
from dateutil.relativedelta import relativedelta

start_year = 2020
end_year = 2023

for year in range(start_year, end_year + 1):
    for month in range(1, 13):
        # 해당 월의 첫 번째 날짜 계산
        start_date = datetime(year, month, 1)
        
        # 해당 월의 다음 달 첫 번째 날짜 계산
        next_month = start_date + relativedelta(months=1)
        
        # 다음 달 첫 번째 날짜에서 하루를 빼고, 이를 해당 월의 마지막 날짜로 설정
        end_date = next_month - relativedelta(days=1)
        
        query = "SELECT time FROM your_table WHERE year = ? AND month = ? AND day >= ? AND day <= ? ORDER BY time ASC LIMIT 1;"
        prepared_query = session.prepare(query)
        result = session.execute(prepared_query, [year, month, start_date.day, end_date.day])
        
        if result.one() is None:
            continue
        
        first_date = result.one().time
        break
    
    if first_date:
        break
        
        
for year in range(end_year, start_year - 1, -1):
    for month in range(12, 0, -1):
        start_date = datetime(year, month, 1)
        next_month = start_date + relativedelta(months=1)
        end_date = next_month - relativedelta(days=1)
        
        query = "SELECT time FROM your_table WHERE year = ? AND month = ? AND day >= ? AND day <= ? ORDER BY time DESC LIMIT 1;"
        prepared_query = session.prepare(query)
        result = session.execute(prepared_query, [year, month, start_date.day, end_date.day])
        
        if result.one() is None:
            continue
        
        last_date = result.one().time
        break
    
    if last_date:
        break

print("First date:", first_date)
print("Last date:", last_date)

만약 db에 30만건 이상 데이터가 있는 경우,

데이터가 일정 주기로 insert되지 않는 경우 구하는 방법

 

-- month 기준

from datetime import datetime

start_year = 2020
end_year = 2023

for year in range(start_year, end_year + 1):
    for month in range(1, 13):
        query = "SELECT time FROM your_table WHERE year = ? AND month = ? ORDER BY time ASC LIMIT 1;"
        prepared_query = session.prepare(query)
        result = session.execute(prepared_query, [year, month])
        
        if result.one() is None:
            continue
        
        first_date = result.one().time
        break
    
    if first_date:
        break

for year in range(end_year, start_year - 1, -1):
    for month in range(12, 0, -1):
        query = "SELECT time FROM your_table WHERE year = ? AND month = ? ORDER BY time DESC LIMIT 1;"
        prepared_query = session.prepare(query)
        result = session.execute(prepared_query, [year, month])
        
        if result.one() is None:
            continue
        
        last_date = result.one().time
        break
    
    if last_date:
        break

print("First date:", first_date)
print("Last date:", last_date)

 

 

-- day 기준