Language/SQL

[SQLITE3] datetime 으로 년, 월, 일 시작 날짜 구하기

멱군 2023. 2. 8. 17:38

SQLite3는 데이터베이스 관리에 필수적인 기능을 갖춘 경량화된 DBMS입니다. 특히, datetime 함수를 사용하여 특정 날짜의 년, 월, 일 시작 지점을 손쉽게 구할 수 있는 기능은 매우 유용합니다. 본문에서는 이를 실제 코드를 통해 자세히 살펴보겠습니다.

 

 

1. 문제의 발단

프로그램을 만들때 무게도 좀 줄이고, mysql 설치하기 귀찮아서 sqlite3로 데이터베이스를 만들었습니다. 그런데 mysql과 구문도 많이 다르고, 안되는 함수도 많아서 돌아가서 구현을 해야 하는 일이 많아졌습니다. 하지만 가볍게 만드는게 목표라 SQLite3에서 `datetime` 함수를 활용하면 특정 날짜를 기준으로 년, 월, 일의 시작 날짜를 구해보려합니다.

 

2. 기본 날짜 및 시간 구하기

SQLite3에서 현재 날짜 및 시간을 구하는 가장 기본적인 쿼리는 다음과 같습니다.

SELECT datetime('now', 'localtime');

이 쿼리는 현지 시간대를 기준으로 현재의 날짜와 시간을 반환합니다.

datetime('now') ==> 이게 현재 시간 날짜를 구하는 date.now 와 같은 거라 친다면, 'localtime' 는 현지시간으로 구하라는 의미입니다.

 

3. 오늘의 시작 날짜 구하기

오늘 날짜의 시작 시점, 즉 자정을 구하기 위한 쿼리는 다음과 같습니다.

SELECT datetime('now', 'localtime', 'start of day');

이 쿼리는 해당 날짜의 00:00:00 시점, 즉 자정의 시간을 반환합니다.

'start of day' 는 오늘의 시작일 => 2023-02-08 00:00:00 처럼 출력됩니다.

 

4. 이번 주의 시작 날짜 구하기

이번 주의 시작 날짜, 특히 주의 첫 날을 구하는 쿼리는 조금 복잡합니다.

일반적으로 주의 첫 날을 일요일로 간주합니다.

이를 구하기 위한 쿼리는 다음과 같습니다.

SELECT datetime(datetime('now', 'weekday 0', '-7 days'), 'localtime', 'start of day');

이 쿼리는 현재 날짜에서 일주일 전의 일요일을 구하고, 그 날짜의 자정 시간을 반환합니다.

weekday 0을 하면 이번주의 마지막날이 나오는데, 대충 일요일이 나옵니다.

글쓴 날짜를 기준으로 2023-02-12 17:33:55 이렇게 나오는데 그래서 일주일 전인 -7을 합니다.

그러면 2023-02-05 17:33:55로 출력이 됩니다. 시간도 00:00:00 이었으면 좋겠기에, 구해진 날짜를 다시 datetime로 감싸서 'start of day' 하면  => 2023-02-05 00:00:00로 출력이 됩니다.

 

5. 이달의 시작 날짜 구하기

이번 달의 시작 날짜를 구하기 위한 쿼리는 다음과 같습니다.

SELECT datetime('now', 'localtime', 'start of month');

이 쿼리는 해당 달의 첫 날의 자정 시간을 반환합니다.

'start of month' 는 이달의 시작일 => 2023-02-01 00:00:00으로 출력됩니다.

 

6. 올해의 시작 날짜 구하기

마지막으로 올해의 시작 날짜를 구하기 위한 쿼리는 다음과 같습니다.

SELECT datetime('now', 'localtime', 'start of year');

이 쿼리는 해당 연도의 첫 날의 자정 시간을 반환합니다.

'start of year' 는 올해의 시작일 => 2023-01-01 00:00:00로 출력이 됩니다.

 

7. 이 글에서 테스트한 SQLITE3 전체 쿼리문

SELECT datetime('now', 'localtime');

SELECT datetime('now', 'localtime', 'start of day');

SELECT datetime(datetime('now', 'weekday 0', '-7 days'), 'localtime', 'start of day');

SELECT datetime('now', 'localtime', 'start of month');

SELECT datetime('now', 'localtime', 'start of year');

 

결론

이러한 쿼리들은 SQLite3에서 날짜 관련 데이터를 다룰 때 매우 유용하며, 복잡한 날짜 계산을 단순화하는 데 큰 도움이 됩니다.

실제 개발 환경에서도 이러한 기능들을 적절히 활용하면 데이터 처리의 효율성을 높일 수 있습니다.

하지만 정말 의미도 많이 다르니 잘 알아보고 쿼리를 작성해야겠습니다.