복붙노트

[SQL] MySQL은 년, 월, 일 필드에서 날짜를 만들기

SQL

MySQL은 년, 월, 일 필드에서 날짜를 만들기

나는 현재 문서가 표시하는 응용 프로그램을 개발하고 회원이 다른 매개 변수의 숫자, 날짜 범위 인 그들 중 하나가이 문서를 검색 할 수 있도록하고있다.

오전 데 문제는 데이터베이스 스키마가 자신이 개발되지 않은 데이터베이스의 창조자가 '일', '달', '년'에 대한 필드는 '날짜'테이블을 만들었다는 것이다.

나는 테이블에서 특정의 년, 월, 일을 선택하고 내가 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. ==============================

    1.당신은 STR_TO_DATE () 함수를 사용할 수 있습니다.

    당신은 STR_TO_DATE () 함수를 사용할 수 있습니다.

  2. ==============================

    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. ==============================

    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. ==============================

    4.이 작업을 수행하는 가장 간단한 방법은 다음과 같습니다

    이 작업을 수행하는 가장 간단한 방법은 다음과 같습니다

    DATE (CONCAT_WS ( '-'년, 월, 일))

    @pbarney 앞서 지적했듯이 LPAD 필요가 없습니다. 다른 날짜 객체와 비교하는 경우, MySQL은 그것을 자동으로 캐스팅되므로 날짜와 함께 포장 반드시 필요한 것은 아니다 :

    some_date_field이> CONCAT_WS ( '-'년, 월, 일)

  5. ==============================

    5.CONCAT ()를 사용하고 그것을 하나 개의 필드를 확인하고 비교하려고합니다.

    CONCAT ()를 사용하고 그것을 하나 개의 필드를 확인하고 비교하려고합니다.

    당신이 연결 후 날짜로 비교할 수 없습니다입니다.

    당신은 정수로 비교할 수 있습니다.

    CONCATENATE 년 월 일 및 정수이 20,101,017와 비교 같이합니다.

    희망 :)

  6. ==============================

    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)
    ;
    
  7. from https://stackoverflow.com/questions/3960049/create-date-from-day-month-year-fields-in-mysql by cc-by-sa and MIT license