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에서 날짜 관련 데이터를 다룰 때 매우 유용하며, 복잡한 날짜 계산을 단순화하는 데 큰 도움이 됩니다.
실제 개발 환경에서도 이러한 기능들을 적절히 활용하면 데이터 처리의 효율성을 높일 수 있습니다.
하지만 정말 의미도 많이 다르니 잘 알아보고 쿼리를 작성해야겠습니다.
'Language > SQL' 카테고리의 다른 글
[MYSQL] SUBSTRING_INDEX() 함수로 구분자 기준(콤마 분리) 분할하기 (0) | 2023.03.14 |
---|---|
[MYSQL] 숫자, 문자열, 날짜시간 변환하기 CAST함수 (0) | 2023.03.14 |
[MYSQL] ERROR errno: 1242 "ER_SUBQUERY_NO_1_ROW" 오류 대처 방법 (0) | 2023.01.06 |
[MYSQL] 같은/다른 테이블에서 원하는 행들 복사 붙여넣기 (2) | 2022.09.14 |
[MYSQL] 검색한 결과를 넣기 select 하여 insert (0) | 2022.08.09 |