MySQL에서 날짜, 월, 연도 필드 만들기
저는 현재 문서를 표시하는 어플리케이션을 개발하고 있으며, 그 중 하나의 날짜 범위 등 다양한 파라미터로 회원들에게 문서를 검색할 수 있도록 하고 있습니다.
문제는 데이터베이스 스키마가 스스로 개발되지 않았고 데이터베이스 작성자가 '일', '월', '년' 필드를 가진 '날짜' 테이블을 만들었다는 것입니다.
테이블에서 특정 일, 월, 연도를 선택하고 SQL에서 날짜 객체를 생성하여 BETWEEN을 사용하여 사용자가 입력한 날짜를 비교할 수 있는 방법을 알고 싶습니다.
날짜 테이블의 구조를 다음에 나타냅니다.
CREATE TABLE IF NOT EXISTS `date` (
`deposition_id` varchar(11) NOT NULL default '',
`day` int(2) default NULL,
`month` int(2) default NULL,
`year` int(4) default NULL,
PRIMARY KEY (`deposition_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
년, 월 및 일 정수 값이 있는 경우 MAKEDATE()와 DATE_ADD()를 조합하여 DATETIME을 만들 수 있습니다.1의 일정한 날을 가진 MAKEDATE()는 특정 연도의 첫 날에 대한 DATETIME을 제공하고 DATE_ADD()를 사용하여 월과 날짜를 추가할 수 있습니다.
mysql> SELECT MAKEDATE(2013, 1);
+-------------------+
| MAKEDATE(2013, 1) |
+-------------------+
| 2013-01-01 |
+-------------------+
mysql> SELECT DATE_ADD(MAKEDATE(2013, 1), INTERVAL (3)-1 MONTH);
+---------------------------------------------------+
| DATE_ADD(MAKEDATE(2013, 1), INTERVAL (3)-1 MONTH) |
+---------------------------------------------------+
| 2013-03-01 |
+---------------------------------------------------+
mysql> SELECT DATE_ADD(DATE_ADD(MAKEDATE(2013, 1), INTERVAL (3)-1 MONTH), INTERVAL (11)-1 DAY);
| DATE_ADD(DATE_ADD(MAKEDATE(2013, 1), INTERVAL (3)-1 MONTH), INTERVAL (11)-1 DAY) |
+----------------------------------------------------------------------------------+
| 2013-03-11 |
+----------------------------------------------------------------------------------+
OP의 질문에 답하려면:
SELECT * FROM `date`
WHERE DATE_ADD(DATE_ADD(MAKEDATE(year, 1), INTERVAL (month)-1 MONTH), INTERVAL (day)-1 DAY)
BETWEEN '2013-01-01' AND '2014-01-01';
STR_을 사용할 수 있습니다.TO_DATE() 함수.
가장 간단한 방법은 다음과 같습니다.
DATE(CONCAT_WS('-', year, month, day))
앞서 @pbarney가 지적한 바와 같이 LPAD는 필요하지 않습니다.다른 날짜 개체와 비교할 경우 MySQL이 자동으로 캐스팅하므로 DATE로 래핑할 필요가 없습니다.
some_date_field > CONCAT_WS('-', year, month, day)
여기서부터 정렬 가능한 날짜 문자열을 작성하려면CONCAT서로 연결해서LPADmonth 및 day 필드의 길이가 두 자리인지 확인합니다.다음과 같은 경우:
CONCAT(`year`,'-',LPAD(`month`,2,'00'),'-',LPAD(`day`,2,'00'))
일단 그걸 손에 넣으면BETWEEN정렬 가능한 형식으로 되어 있습니다.그러나 이러한 필드를 실제 날짜 필드로 변환해야 하는 경우 전체 데이터를 로 묶을 수 있습니다.UNIX_TIMESTAMP()타임스탬프 값을 가져옵니다.
결국 이렇게 되는 거죠.
SELECT UNIX_TIMESTAMP(CONCAT(`year`,'-',LPAD(`month`,2,'00'),'-',LPAD(`day`,2,'00'))) as u_date
WHERE u_date BETWEEN timestamp_1 and timestamp_2
단, 이 작업은 필드가 처음부터 단순한 타임스탬프일 때보다 훨씬 느리다는 점에 유의하십시오.연도, 월, 일 필드에 대한 인덱스를 반드시 준비해야 합니다.
이에 대한 제 견해는 다음과 같습니다.
DELIMITER $$
CREATE FUNCTION fn_year_month_to_date(var_year INTEGER,
var_month enum('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12')
)
RETURNS DATE
BEGIN
RETURN (MAKEDATE(var_year, 1) + INTERVAL (var_month - 1) MONTH);
END $$
DELIMITER ;
SELECT fn_year_month_to_date(2020, 12)
;
CONCAT()를 사용하여 하나의 필드로 만들고 비교합니다.
연결 후 날짜로 비교할 수 있을지 모르겠습니다.
정수로 비교할 수 있습니다.
년월일을 합산하여 이 20101017과 같은 정수를 만들고 비교합니다.
희망사항 :)
언급URL : https://stackoverflow.com/questions/3960049/create-date-from-day-month-year-fields-in-mysql
'programing' 카테고리의 다른 글
| 오류 "filename"입니다.이 플랫폼에서는 지원되지 않는 휠입니다. (0) | 2023.02.05 |
|---|---|
| 가능한 한 간단한 방법으로 Matplotlib의 PyPlot에 범례 추가 (0) | 2023.02.05 |
| vuej에서 rootState란 무엇인가, vuex 컨텍스트 (0) | 2023.02.05 |
| 캐스팅을 피해야 하는 이유는 무엇입니까? (0) | 2023.02.05 |
| django 테스트에서는 mariadb와 keepdb를 어떻게 사용합니까? (0) | 2023.02.05 |