2014-06-24 3 views
0

datetime 필드 ('scrape')를 기반으로 계산 된 mysql 데이터베이스에 새로운 열 ('closed_date')을 추가 할 준비를하고있다.mysql가 시간을 비교하는 데 도움이된다

특히, 필드 스크랩 (datetime) 시간이 오후 6시보다 길면 23시 59 분 00 분의 시간으로 스크랩 한 날짜로 closed_date를 설정하십시오. 그렇지 않으면 closed_date를 설정하여 간격 -1 일을 23:59:00의 시간으로 긁습니다.

나는 시간 비교 작업이 어려워졌습니다.

여기에 바이올린 스키마입니다 ... 여기

drop table if exists mytable; 
create table mytable (
scrape datetime, 
average_rating int, 
number_of_ratings int, 
factored_rating int); 
insert into mytable 
select '2014-05-29 00:13:55',5,2,3 union all 
select '2014-05-29 00:14:42',4,1,5 union all 
select '2014-05-29 21:08:18',12,3,1 union all 
select '2014-05-30 00:14:46',11,4,2 union all 
select '2014-05-30 21:08:22',8,2,12; 

는 SQL의 ...

SELECT 
    scrape, 
    DATE_FORMAT(scrape,'%H:%i:%s') TIMEONLY, 
    DATE_FORMAT(STR_TO_DATE('18:00:00','%T'),'%T') SIXPM, 
    @x := IF(@TIMEONLY > @SIXPM, DATE_FORMAT(scrape, '%Y-%m-%d 23:59:00'), DATE_ADD(scrape, INTERVAL -1 DAY)) close_date 
FROM mytable 

결과 :

SCRAPE     TIMEONLY SIXPM   CLOSE_DATE 
May, 29 2014 00:13:55+0000 00:13:55 18:00:00 2014-05-28 00:13:55 
May, 29 2014 00:14:42+0000 00:14:42 18:00:00 2014-05-28 00:14:42 
May, 29 2014 21:08:18+0000 21:08:18 18:00:00 2014-05-28 21:08:18 
May, 30 2014 00:14:46+0000 00:14:46 18:00:00 2014-05-29 00:14:46 
May, 30 2014 21:08:22+0000 21:08:22 18:00:00 2014-05-29 21:08:22 

IF는 TIMEONLY이 경우에도 항상 FALSE입니다 SIXPM보다 큽니다.

어떤 통찰력에도 감사드립니다!

+0

참고 ... 나는 @ 접두어로 놀아왔다. 나는 꽤 확신한다. @ SIXPM <> SIXPM,하지만 어쨌든 그것을 시도했다. –

+0

나는 그것을 이해했다. TIMEONLY 필드는 IF 비교에 사용할 수 없으므로 다른 임시 필드 (@tim)를 만들어야했습니다. 8 시간의 지연이있을 때 답변을 게시 할 것입니다. –

답변

0

나는 그것을 알아 냈다.

SCRAPE      CLOSE_DATE 
May, 29 2014 00:13:55+0000 May, 28 2014 23:59:00 
May, 29 2014 00:14:42+0000 May, 28 2014 23:59:00 
May, 29 2014 21:08:18+0000 May, 29 2014 23:59:00 
May, 30 2014 00:14:46+0000 May, 29 2014 23:59:00 
May, 30 2014 21:08:22+0000 May, 30 2014 23:59:00 

추신을 :

SELECT 
    scrape, 
    @tim := DATE_FORMAT(scrape,'%H:%i:%s'), 
    @six := DATE_FORMAT(STR_TO_DATE('18:00:00','%T'),'%T'), 
    IF(@tim > @six, DATE_FORMAT(scrape, '%Y-%m-%d 23:59:00'), DATE_FORMAT(DATE_ADD(scrape, INTERVAL -1 DAY),'%Y-%m-%d 23:59:00')) close_date 
FROM mytable 

지금 결과가 내가 기대하는 것입니다 ... TIMEONLY 필드는 IF 비교를 사용할 수 없습니다, 그래서 다른 임시 필드 (@ 팀)를했습니다 나는 파이썬을 통해 현장 업데이트를했다.

for row in cur: 
    print row 
    stkid = row[0] 
    # check if after 5pm close... 
    if int(row[1].strftime("%H")) > 17: 
     cldt = row[1].strftime("%Y-%m-%d") 
    else: 
     # else it's in the wee hours, so we need to subtract a day 
     cldt = (row[1] - relativedelta(days=1)).strftime("%Y-%m-%d") 
    print "greater than five pm...", row[1].strftime("%H"), row, cldt 
관련 문제