2017-12-22 19 views
1

PHP를 사용하여 MySQL 데이터베이스에 액세스하고 있습니다.날짜가 UNIX 타임 스탬프로 저장된 날짜의 특정 날짜에 대한 MySQL 필터

표 헤더 : :이처럼 내장 테이블이

  • 아이디 (INT, 자동 증가), profileID가, 타임 스탬프를

표 내용 :

  • 1, 12345678, 1513814399 (= 12/21/2017)
  • 2, 13451983, 1513814400 (= 12/21/2017)
  • 3 12345678, 1513944000 (= 2017년 12월 22일)
  • 4 12345678, 1513944001 (= 2017년 12월 22일)

profileids 웹 사이트 방문자에 의해 호출 된 테이블을 도시하는 시각.

이제 내 질문에 어떻게 표시 할 수 있습니까? 예 : "12 월 22 일에 프로필 번호 12345678이 (가) 호출됩니다."이 경우 2가됩니다. .

SELECT COUNT(profileid), from_unixtime(timestamp, '%d') AS day, from_unixtime(timestamp, '%m') as month, from_unixtime(timestamp, '%Y') as year WHERE profileid='12345678' AND day=22 AND month=12 AND year=2017; 

을하지만 그들은 테이블에 존재하지 않는 있기 때문에 열을 액세스하기 위해 "하루", "달"과 "해"수 없습니다 :

나는이 쿼리를 시도했다.

누군가가 나에게이 작업을 수행하는 방법에 대한 팁을 줄 수 있습니까? 또 다른 방법은 세 개의 새로운 열 (timestamp_day, timestamp_month 및 timestamp_year)을 만드는 것이지만 좋은 해결책은 아닙니다.

미리 감사드립니다.

teha

+0

"타임 스탬프"필드에는 어떤 데이터 유형이 있습니까? 왜 그것을 "날짜"로 직접 설정하지 않습니까? 당신이 원하는대로 변환이 필요로하는 형식으로 저장할 필요가없는 것 같습니다. –

+0

MySQL에는 날짜 필드에 적용 할 수있는'DAY()','MONTH()'및'YEAR() 등의 날짜 함수가 있습니다. 'https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html –

+0

의견을 보내 주셔서 감사합니다. 정수형입니다. 내가 그것을 정직하기 위해 익숙해 져서 시간 차이를 계산하는 것이 좋기 때문에 그렇게하는 것이 좋습니다. – teha

답변

3

날짜 만 입력하면됩니다. 나는 당신이 원하는 생각 :

SELECT COUNT(profileid) 
FROM t 
WHERE DATE(from_unixtime(timestamp)) = '2017-12-22' AND 
     profileid = '12345678'; 

가 나는 등이 작성하는 경향이 될 것이다 :

SELECT COUNT(profileid) 
FROM t 
WHERE profileid = '12345678' AND 
     timestamp >= UNIX_TIMESTAMP('2017-12-22') AND 
     timestamp < UNIX_TIMETAMP('2017-12-23'); 

이 쿼리는 t(profileid, timestamp)에 인덱스의 전체를 사용하게 할 수 있습니다.

+0

이것은 굉장히 좋습니다. 이런 일이 가능하다는 것을 몰랐습니다. 나는 그것을 테스트하고 피드백을 줄 것이다! – teha

0

DAY, MONTHYEAR 기능을 FROM_UNIXTIME과 결합하여 사용할 수 있습니다.

SELECT COUNT(profileid) 
WHERE profileid='12345678' 
AND DAY(FROM_UNIXTIME(timestamp))=22 
AND MONTH(FROM_UNIXTIME(timestamp))=12 
AND YEAR(FROM_UNIXTIME(timestamp))=2017; 
0

여기 몇 가지가 있습니다.

  1. 원시 시간 소인을 으로 MySQL TIMESTAMP 개체로 변환 할 수 있습니다. 너는 이미 그것을 알고있다.
  2. 일단 TIMESTAMP을 사용하면 모든 종류의 날짜 기능을 사용할 수 있습니다.
  3. UNIX_TIMESTAMP()
  4. 으로 다른 방향으로 변환 할 수 있습니다. 하루 동안 레코드를 조회 할 때 날짜 범위 검색을 수행 할 수 있습니다.

그래서 쿼리는 아마 다음 날 자정을 포함하지 최대하지만, 당신이 원하는 일에 모든 타임 스탬프 값을 선택할 것입니다

SELECT COUNT(*) cnt 
    FROM t 
    WHERE profileid = '12345678' 
     AND timestamp >= UNIX_TIMESTAMP('2017-12-22') 
     AND timestamp < UNIX_TIMESTAMP('2017-12-23') 

해야한다. (profileid, timestamp)에 대한 색인이있는 경우이 종류의 쿼리는 빠릅니다.

참고도

SELECT COUNT(*) cnt, profileid 
    FROM t 
    WHERE timestamp >= UNIX_TIMESTAMP('2017-12-22') 
     AND timestamp < UNIX_TIMESTAMP('2017-12-23') 
    GROUP BY profileid 

을하고 그 일에 대한 모든 프로파일 식별자의 수를 표시하는 결과 집합을 얻을 수 있습니다. 그리고 할 수있어

SELECT COUNT(*) cnt, profileid, DATE(FROM_UNIXTIME(timestamp)) day 
    FROM t 
    WHERE timestamp >= UNIX_TIMESTAMP('2017-11-01') 
     AND timestamp < UNIX_TIMESTAMP('2017-12-01') 
    GROUP BY profileid, DATE(FROM_UNIXTIME(timestamp)) 

그리고 11 월을 위해 모든 것을 얻으십시오.

SELECT COUNT(*) cnt, profileid, LAST_DAY(FROM_UNIXTIME(timestamp)) month_ending 
    FROM t 
    WHERE timestamp >= UNIX_TIMESTAMP('2017-01-01') 
     AND timestamp < UNIX_TIMESTAMP('2018-01-01') 
    GROUP BY profileid, LAST_DAY(FROM_UNIXTIME(timestamp)) 

을하고 전체 년 동안 월별로 요약 정보를 얻을 수 있습니다.

날짜 계산이 유용합니다. 이것이 많은 테이블 디자인이 원시 정수형 타임 스탬프가 아닌 DATETIMETIMESTAMP과 같은 실제 날짜 스탬프 형식 필드를 사용하는 이유입니다.