[SQL] MySQL은 년, 월, 일 필드에서 날짜를 만들기
SQLMySQL은 년, 월, 일 필드에서 날짜를 만들기
나는 현재 문서가 표시하는 응용 프로그램을 개발하고 회원이 다른 매개 변수의 숫자, 날짜 범위 인 그들 중 하나가이 문서를 검색 할 수 있도록하고있다.
오전 데 문제는 데이터베이스 스키마가 자신이 개발되지 않은 데이터베이스의 창조자가 '일', '달', '년'에 대한 필드는 '날짜'테이블을 만들었다는 것이다.
나는 테이블에서 특정의 년, 월, 일을 선택하고 내가 BETWEEN 사용하여 사용자가 날짜 입력을 비교할 수 있도록 SQL에서 날짜 객체를 만드는 방법을 알고 싶습니다.
다음 날짜 테이블의 구조는 다음과 같다 :
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;
해결법
-
==============================
1.당신은 STR_TO_DATE () 함수를 사용할 수 있습니다.
당신은 STR_TO_DATE () 함수를 사용할 수 있습니다.
-
==============================
2.당신은 년, 월, 일에 대한 정수 값을 가질 때 당신은 MAKEDATE ()와 DATE_ADD () 결합하여 DATETIME을 만들 수 있습니다. 1의 일정한 하루 MAKEDATE ()는 당신에게 특정 연도의 첫 날에 대한 DATETIME을 줄 것이다, 그리고 당신은 DATE_ADD ()와 월과 하루에 추가 할 수 있습니다 :
당신은 년, 월, 일에 대한 정수 값을 가질 때 당신은 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';
-
==============================
3.그에서 정렬 날짜 문자열을 구축하기 위해, 당신은 CONCAT 함께 비트에 가입하고 LPAD 확신 월 및 일 필드는 두 자리가 긴 확인해야합니다. 이 같은:
그에서 정렬 날짜 문자열을 구축하기 위해, 당신은 CONCAT 함께 비트에 가입하고 LPAD 확신 월 및 일 필드는 두 자리가 긴 확인해야합니다. 이 같은:
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
그러나,이 필드는 처음부터 단순한 타임 스탬프 인 경우에 비해 대규모 속도가 느려집니다 점에 유의. 그리고 당신은 확실히 당신이 년, 월, 일 필드에 인덱스를 가지고 있는지 확인해야합니다.
-
==============================
4.이 작업을 수행하는 가장 간단한 방법은 다음과 같습니다
이 작업을 수행하는 가장 간단한 방법은 다음과 같습니다
DATE (CONCAT_WS ( '-'년, 월, 일))
@pbarney 앞서 지적했듯이 LPAD 필요가 없습니다. 다른 날짜 객체와 비교하는 경우, MySQL은 그것을 자동으로 캐스팅되므로 날짜와 함께 포장 반드시 필요한 것은 아니다 :
some_date_field이> CONCAT_WS ( '-'년, 월, 일)
-
==============================
5.CONCAT ()를 사용하고 그것을 하나 개의 필드를 확인하고 비교하려고합니다.
CONCAT ()를 사용하고 그것을 하나 개의 필드를 확인하고 비교하려고합니다.
당신이 연결 후 날짜로 비교할 수 없습니다입니다.
당신은 정수로 비교할 수 있습니다.
CONCATENATE 년 월 일 및 정수이 20,101,017와 비교 같이합니다.
희망 :)
-
==============================
6.이 답변을 확장, 여기에 필자는 다음과 같습니다
이 답변을 확장, 여기에 필자는 다음과 같습니다
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) ;
from https://stackoverflow.com/questions/3960049/create-date-from-day-month-year-fields-in-mysql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 MySQL의 날짜에서 연도와 월을 추출하고이를 비교합니까? (0) | 2020.07.04 |
---|---|
[SQL] SQL은하지 쿼리와 동일한에 널 값을 표시하지? (0) | 2020.07.04 |
[SQL] NOT LIKE IN과 SQL 쿼리 (0) | 2020.07.04 |
[SQL] 정수와 일, 월 및 연도 주어진 SQL Server에서 날짜를 만드는 방법 (0) | 2020.07.04 |
[SQL] 선택 권한, 데이터베이스 'mssqlsystemresource', 스키마 'SYS'대상 '을 sysobjects'에 거부 (0) | 2020.07.04 |