[mysql] 어제 날짜를 선택하는 MySQL

날짜가 어제 인 값을 어떻게 표시하고 계산할 수 있습니까? 나는 time()데이터베이스에 날짜를 삽입했습니다. 예:

URL: google.com youtube.com google.com youtube.com test.com youtube.com
DateVisited: 1313668492 1313668540 1313668571 13154314

표에 여러 개의 URL이있는 URL과 어제 방문한 URL의 수도 표시하고 싶습니다. 결과 예 :

LINK       | timesExisted | timesVisitedYesterday
Google.com |       2      | 2
youtube.com|       3      | 3

나는 이미 어제 날짜를 얻는 것에 대한 아이디어를 가지고 있지만 어제 URL이 얼마나 많이 존재했는지 계산하고 URL이 테이블에 얼마나 많이 존재했는지 계산하는 것에 대한 아이디어가 없습니다.



답변

어제 날짜를 얻는 가장 간단하고 가장 좋은 방법은 다음과 같습니다.

subdate(current_date, 1)

쿼리는 다음과 같습니다.

SELECT 
    url as LINK,
    count(*) as timesExisted,
    sum(DateVisited between UNIX_TIMESTAMP(subdate(current_date, 1)) and
        UNIX_TIMESTAMP(current_date)) as timesVisitedYesterday
FROM mytable
GROUP BY 1

호기심을 불러 일으키는 조건을 만족하는 행 sum(condition) 를 제공 하는 이유 는 성가신 case문장이 필요합니다. mysql에서 부울 값은 1참과 0거짓에 대한 것이므로 조건을 합산하면 몇 번이나 효과적으로 계산됩니다. 사실입니다. 이 패턴을 사용하면 SQL 코드를 정리할 수 있습니다.


답변

SELECT SUBDATE(NOW(),1);

now () 함수는 Timestamp에서 시스템의 현재 날짜와 시간을 되돌립니다.

당신이 사용할 수있는:

SELECT SUBDATE(CURDATE(),1)


답변

당신이 사용할 수있는:

SELECT SUBDATE(NOW(), 1);

또는

SELECT SUBDATE(NOW(), INTERVAL 1 DAY);

또는

SELECT NOW() - INTERVAL 1 DAY;

또는

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);


답변

표현식을 사용하여 어제 날짜를 얻을 수 있습니다 CAST(NOW() - INTERVAL 1 DAY AS DATE). 따라서 다음과 같이 작동 할 수 있습니다.

SELECT * FROM your_table

WHERE DateVisited >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND DateVisited <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));


답변

지난주에 대한 쿼리 :

SELECT *
FROM dual
WHERE search_date BETWEEN SUBDATE(CURDATE(), 7) AND CURDATE()


답변

마지막 또는 다음 날짜, 주, 월 및 연도 계산. 누구에게나 도움이 될 수 있습니다.

현재 날짜 :

select curdate();

어제:

select subdate(curdate(), 1)

내일:

select adddate(curdate(), 1)

지난 1 주일 :

select between subdate(curdate(), 7) and subdate(curdate(), 1)

다음 1 주일 :

between adddate(curdate(), 7) and adddate(curdate(), 1)

지난 1 개월 :

between subdate(curdate(), 30) and subdate(curdate(), 1)

다음 1 개월 :

between adddate(curdate(), 30) and adddate(curdate(), 1)

이번 달:

subdate(curdate(),day(curdate())-1) and last_day(curdate());

지난 1 년 :

between subdate(curdate(), 365) and subdate(curdate(), 1)

다음 1 년 :

between adddate(curdate(), 365) and adddate(curdate(), 1)


답변

선택한 답변이 정확하고 간결하지만 다른 답변에 언급 된 구조에 대해 주장합니다.

SELECT * FROM your_table
WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));

타임 스탬프없이 맨날 날짜 만 필요하다면 다음과 같이 작성할 수도 있습니다.

SELECT * FROM your_table
WHERE DateVisited >= CAST(NOW() - INTERVAL 1 DAY AS DATE)
  AND DateVisited <= CAST(NOW() AS DATE);

사용하는 이유 CASTSUBDATEIS는 CASTANSI SQL 구문입니다. SUBDATE의 날짜 산술 구성 요소의 MySQL 특정 구현입니다 CAST. ANSI 구문을 사용하는 습관을 들이면 다른 데이터베이스로 마이그레이션해야하는 경우 골칫거리를 줄일 수 있습니다. 미래에 다른 DBMS와 거의 확실하게 작업 할 것이므로 전문적인 연습으로 습관화하는 것도 좋습니다.

주요 DBMS 시스템 중 어느 것도 ANSI와 완전히 호환되지는 않지만 대부분은 광범위한 ANSI 구문을 구현하는 반면 MySQL 및 그 하위 항목 (MariaDB, Percona 등) 외부에서는 거의 모든 시스템이 MySQL 전용 구문을 구현하지 않습니다.