2012-07-27 3 views
0

우리는 데이터베이스로 MySQL을 사용하여 타임 스탬프가있는 메시지를 저장합니다. 지난 주 평일의 메시지를 반환하는 쿼리를 만들 수 있습니까?지난 n 평일 sql 어디에서 clausel

e.e. n이 4이고 오늘이 화요일이면 월요일, 지난 주 금요일, 지난 주 목요일 및 지난 주 수요일의 메시지를 원합니다.

답변

2

을 제외하는 것입니다 지난 주에 생성 된 열을 추구하는 것입니다. C int/int 그냥 할 것, INTERVAL -N WEEKS

  • FLOOR으로,

    • ADD_DATE : Vatev은 사전에 날짜 별 날짜를 계산해야하지만, 당신이 정말로 이렇게 할 경우, 당신은 아마 다음과 같은 기능이 필요합니다 권장 잘
    • MOD, a % b :
    • WEEKDAY

    F 당신은 당신이 돌아 가야한다 얼마나 많은 주 계산해야 필요한 모든의 IRST, 그것은 우리가 주 처리를 촬영했습니다

    weeks = FLOOR(days/5) 
    

    즉, 당신 one week = 5 days 들어 ... 쉬운, 그래서 우리는 지금 작업을해야합니다 나머지 :

    rest = days MOD 5 
    

    이제 우리는 두 개의 사례를 가지고는, 주말에 발생 또는 아니, 없었다하는 경우에 주말은 좋다. 스킵하기 위해 2 일을 추가해야합니다. 주말이 경우 (WEEKDAY(now) - rest) < 0

    rest = IF((WEEKDAY(now) - rest) < 0, rest + 2, rest) 
    

    발생 그리고 지금 우리는 (의 당신이 {days}{rest} 미리 계산되어 있다고 가정하자) 하나 개 파에 구축 할 수없는 주말을 포함,

    WHERE date >= ADD_DATE(
        ADD_DATE (
         {now}, 
         INTERVAL -IF((WEEKDAY({now}) - {rest}) < 0, {rest} + 2, {rest}) DAYS, 
        ), 
        INTERVAL -FLOOR({days}/5) WEEKS 
    ) 
    
  • +0

    자세한 설명을 부탁드립니다. Vatev가 지적했듯이, db에서 약간의 스트레스를 가하기 위해 응용 프로그램의 시작일을 계산할 것입니다. – Thomas

    +1

    DB의 스트레스는 무시해도 좋을지 모르지만,보다 정교한 언어로하면 스트레스가 적어 질 것입니다. P – Vatev

    +0

    @ 토마스 내가 쓴대로 다른 언어로 재사용 할 수 있습니다. , 특히 PHP는 ([strtotime'] (http://php.net/manual/en/function.strtotime.php)에서) 간격을 허용하고 논리는 동일합니다. 작은 리소스를 절약하기 위해'timestamp() - weeks * 7days * 24hour * 3600seconds '를 수행 할 수도 있습니다. – Vyktor

    0

    다음과 같이 해 보셨습니까?

    SELECT columns 
    FROM table 
    WHERE datediff(column_with_timestamp,NOW()) > n 
    

    여기서 N은 찾고있는 일 수입니다.

    는 는
    +0

    주 일. – Vyktor

    1

    내가 선택한 언어로 시작 일자 (쿼리의 {시작일을})를 계산 한 다음이 같은 것을 실행 가지고 올 수있는 최선 :

    SELECT some_things 
    FROM your_table 
    WHERE 
        WEEKDAY(time_column) < 5 
        AND time_column >= {start_date} 
    ORDER BY time_column DESC 
    

    또한 저장 할 수 있습니다 함수를 사용하여 'x 일 전 일'을 계산하고 {start_date}에 사용합니다.

    +0

    아주 좋은 제안, 고마워. – Thomas

    0
    COL >= date_sub(NOW(), interval 1 week) and 
    weekday(COL) < 5 
    
    • DATE_SUB는 조금 복잡한 것 MySQL을 직접이 작업을 수행하려면
    • 요일이 일요일이나 토요일
    관련 문제