어제 날짜를 선택하는 MySQL


102

날짜가 어제 인 값을 어떻게 표시하고 계산할 수 있습니까? 나는 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이 테이블에 얼마나 많이 존재했는지 계산하는 것에 대한 아이디어가 없습니다.

답변:


167

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

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 코드를 정리할 수 있습니다.


91
SELECT SUBDATE(NOW(),1);

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

당신이 사용할 수있는:

SELECT SUBDATE(CURDATE(),1)

3
나를 위해 일했습니다. 많은 감사
마블이 조지

20

당신이 사용할 수있는:

SELECT SUBDATE(NOW(), 1);

또는

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

또는

SELECT NOW() - INTERVAL 1 DAY;

또는

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

11

표현식을 사용하여 어제 날짜를 얻을 수 있습니다 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));

9

지난주에 대한 쿼리 :

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

9

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

현재 날짜 :

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)

7

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

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 전용 구문을 구현하지 않습니다.


하나가 다른 하나를 선택하는 이유에 대한 좋은 설명.
Sablefoste

4

나는 그것을 작동시킬 수 없었기 때문에 cdhowie의 위 답변 중 하나를 적용했습니다. 이것은 나를 위해 일하는 것 같습니다. UNIX_TIMESTAMP 함수를 사용하여이 작업을 수행하는 것도 가능하다고 생각합니다.

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));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.