MySQL
날짜 및 시간 작업
수색…
지금()
Select Now();
현재 서버 날짜 및 시간을 표시합니다.
Update `footable` set mydatefield = Now();
이렇게하면 mydatefield
필드가 서버의 구성된 시간대의 현재 서버 날짜 및 시간으로 업데이트됩니다 (예 :
'2016-07-21 12:00:00'
날짜 산술
NOW() + INTERVAL 1 DAY -- This time tomorrow
CURDATE() - INTERVAL 4 DAY -- Midnight 4 mornings ago
3 ~ 10 시간 전에 요청 된 저장된 mysql 질문 표시 (180 분 ~ 600 분 전) :
SELECT qId,askDate,minuteDiff
FROM
( SELECT qId,askDate,
TIMESTAMPDIFF(MINUTE,askDate,now()) as minuteDiff
FROM questions_mysql
) xDerived
WHERE minuteDiff BETWEEN 180 AND 600
ORDER BY qId DESC
LIMIT 50;
+----------+---------------------+------------+
| qId | askDate | minuteDiff |
+----------+---------------------+------------+
| 38546828 | 2016-07-23 22:06:50 | 182 |
| 38546733 | 2016-07-23 21:53:26 | 195 |
| 38546707 | 2016-07-23 21:48:46 | 200 |
| 38546687 | 2016-07-23 21:45:26 | 203 |
| ... | | |
+----------+---------------------+------------+
TIMESTAMPDIFF()
대한 MySQL 매뉴얼 페이지.
주의 MySQL에서 날짜 계산을 위해 CURDATE() + 1
과 같은 표현식을 사용하지 마십시오. 그들은 특히 오라클 데이터베이스 제품에 익숙하다면 기대 한 바를 반환하지 않습니다. 대신 CURDATE() + INTERVAL 1 DAY
사용하십시오.
날짜 범위에 대한 테스트
BETWEEN
... AND
... 기간을 사용하는 것은 매우 유혹적이지만 문제는 있습니다. 대신이 패턴은 대부분의 문제를 방지합니다.
WHERE x >= '2016-02-25'
AND x < '2016-02-25' + INTERVAL 5 DAY
장점 :
-
BETWEEN
은 최종 날짜 또는 초를 포함하여 '포괄적'입니다. -
23:59:59
초DATETIME
에 마이크로 초 해상도가 있으면 서투른 및 잘못입니다. - 이 패턴은 윤년 및 기타 데이터 계산을 피할 수 있습니다.
-
x
가DATE
,DATETIME
또는TIMESTAMP
이든 상관없이 작동합니다.
SYSDATE (), NOW (), CURDATE ()
SELECT SYSDATE();
이 함수는 함수가 문자열 또는 숫자 문맥에서 사용되는지 여부에 따라 현재 날짜와 시간을 'YYYY-MM-DD HH:MM:SS'
또는 YYYYMMDDHHMMSS
형식의 값으로 반환합니다. 현재 시간대의 날짜와 시간을 반환합니다.
SELECT NOW();
이 함수는 SYSDATE()
의 동의어입니다.
SELECT CURDATE();
이 함수는 시간이없는 현재 날짜를 문자열 또는 숫자 컨텍스트에서 사용되는지 여부에 따라 'YYYY-MM-DD'
또는 YYYYMMDD
형식의 값으로 반환합니다. 현재 시간대의 날짜를 반환합니다.
주어진 날짜 또는 날짜 시간 표현식에서 날짜 추출
SELECT DATE('2003-12-31 01:02:03');
출력은 다음과 같습니다.
2003-12-31
날짜 및 시간 조회를위한 색인 사용
많은 실세계 데이터베이스 테이블은 DATETIME
또는 TIMESTAMP
컬럼 값이 수십 년을 포함하여 많은 시간을 포함하는 많은 행을 가지고 있습니다. 종종 WHERE
절을 사용하여 해당 시간 범위의 일부 하위 집합을 검색해야합니다. 예를 들어, 테이블에서 2016 년 9 월 1 일까지 날짜 행을 검색하려고 할 수 있습니다.
비효율적 인 방법은 다음과 같습니다.
WHERE DATE(x) = '2016-09-01' /* slow! */
열의 값에 DATE()
함수를 적용하기 때문에 비효율적입니다. 즉, MySQL은 x
각 값을 검사해야하며 인덱스는 사용할 수 없습니다.
이 작업을 수행하는 더 좋은 방법은 다음과 같습니다.
WHERE x >= '2016-09-01'
AND x < '2016-09-01' + INTERVAL 1 DAY
이 값의 범위 선택 x
때까지, 해당 일의 아무 곳이나 거짓말을하지만 (따라서 포함되지 <
다음 날) 자정.
테이블에 x
열의 인덱스가있는 경우 데이터베이스 서버는 인덱스에 대해 범위 스캔을 수행 할 수 있습니다. 즉, x의 첫 번째 적절한 값을 빠르게 찾은 다음 마지막 관련 값을 찾을 때까지 인덱스를 순차적으로 스캔 할 수 있습니다. 인덱스 범위 스캔은 DATE(x) = '2016-09-01
필요한 전체 테이블 스캔보다 훨씬 효율적입니다.
더 효율적으로 보일지라도 이것을 사용하도록 유혹하지 마십시오.
WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY /* wrong! */
범위 스캔과 동일한 효율성을 갖지만 x
값이 x
행을 2016 년 9 월 2 일 자정에 정확히 선택합니다. 이는 원하는 것이 아닙니다.