2017-12-14 7 views
0

나는 Python SQLAlchemy를 사용하여 Redshift 인스턴스에 연결합니다. 나는 작동하는 2 datetimes 사이에 분 안에 DATEDIFF를 계산하려고합니다. 하지만 결과를 FLOAT에 캐스팅하고 '< 1'에 대해 사용할 때 '그 다음'결과 만 얻습니다.Postgres/Redshift DATEDIFF를 FLOAT로 변환

SELECT distinct u2.id, 
    CASE 
    WHEN 
     CAST(DATEDIFF(minute, u1.usa_start_datetime::timestamp,u1.usa_end_datetime::timestamp) * 1.00 as FLOAT) < 1.00 
     THEN 1.00 END as fsess_hr, 
+1

예상되는 결과는 무엇입니까? 'ELSE' 절이 없으므로'1.0' 또는'NULL' 만 얻을 수 있습니다. – pault

+0

'python' 태그를 제거해야한다고 생각합니다. 이것은 엄격하게'SQL' 질문과 같습니다. – pault

답변

1

당신은 당신의 CASE 문에 ELSE 절을 누락되었습니다.

SELECT distinct 
     u2.id, 
     CASE 
     WHEN CAST(DATEDIFF(minute, u1.usa_start_datetime::timestamp,u1.usa_end_datetime::timestamp) * 1.00 as FLOAT) < 1.00 THEN 1.00 
     ELSE CAST(DATEDIFF(minute, u1.usa_start_datetime::timestamp,u1.usa_end_datetime::timestamp) * 1.00 as FLOAT) 
     END as fsess_hr 
    FROM some_table 

을 또한 난 당신이 * 1.00

1
필요하다고 생각하지 않는다 : 차이가 부동 소수점 수와 차이가 그렇지 않은 경우보다 1이고 경우 1.0을 얻고 싶다면 다음과 같이 쿼리를 수정

DATEDIFF()의 반환 유형은 BIGINT이고 분 단위로 선택했습니다. 그래서 case expression 다음

SELECT /* DISTINCT */ -- is this really needed? 
     u2.id 
    , CAST(
      CASE WHEN DATEDIFF(MINUTE, u1.usa_start_datetime ::timestamp, u1.usa_end_datetime ::timestamp) < 1 THEN 1 
       ELSE DATEDIFF(MINUTE, u1.usa_start_datetime ::timestamp, u1.usa_end_datetime ::timestamp) 
      END 
     AS Float) AS fsess_hr 
FROM ... 

을 떠 값을 캐스팅하지만 여전히 분의 숫자를 반환하는 내 정수 처리, 그래서 나는 이유가 호출 fsess_hr을 따르지 않는, 당신은으로 나누면 않습니다 어떤 점에서 60.0?