Postgres / Redshift DATEDIFF转换为FLOAT

时间:2017-12-14 00:50:51

标签: sql amazon-redshift

我使用Python SQLAlchemy连接到Redshift实例。我试图在两个日期时间之间以分钟计算DATEDIFF,这是有效的。但是当我尝试将结果CAST到FLOAT并在CASE WHEN中使用它时对'< 1',我只得到'那么'的结果?

private void gdEnglish_MouseLeave(object sender, MouseEventArgs e)
{
    gdEnglish_clickflag = false;
}

private void gdEnglish_MouseUp(object sender, MouseButtonEventArgs e)
{
    if (gdEnglish_clickflag)
    {
        gdEnglish_clickflag = false;
        e.Handled = true;

            //////////
            // YOUR //
            // CODE //
            //////////
        }
    }

private void gdEnglish_MouseDown(object sender, MouseButtonEventArgs e)
{
    gdEnglish_clickflag = true;
}

private void gdEnglish_TouchLeave(object sender, TouchEventArgs e)
{
    gdEnglish_clickflag = false;
}

private void gdEnglish_TouchUp(object sender, TouchEventArgs e)
{
    if (gdEnglish_clickflag)
    {
        gdEnglish_clickflag = false;
        e.Handled = true;

        //////////
        // YOUR //
        // CODE //
        //////////
    }
}

private void gdEnglish_TouchDown(object sender, TouchEventArgs e)
{
    gdEnglish_clickflag = true;
}

3 个答案:

答案 0 :(得分:1)

您在ELSE声明中缺少CASE条款。如果您希望得到1.0如果差异小于1而差异为浮点数,则修改您的查询,如下所示:

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)

DATEDIFF()的返回类型为BIGINT,您已选择以分钟为单位。因此处理case expression中的整数然后将值转换为float

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吗?

答案 2 :(得分:0)

我发现:: float可以与datediff配合使用。看上去比cast() as float

干净
SELECT distinct u2.id,
CASE 
    WHEN DATEDIFF(minute,u1.usa_start_datetime::timestamp,u1.usa_end_datetime::timestamp)::float < 1.00 
THEN 1.00 END as fsess_hr,