将bigint转换为date,以便我可以在where子句中使用

时间:2015-05-27 08:40:48

标签: sql postgresql

我的约会是bigint类型。 我该如何选择日期?

获取日期的典型查询就像这样

select date from my_table where date<='20150101'

现在的问题是,日期属于bigint类型

4 个答案:

答案 0 :(得分:1)

使用:

select to_timestamp(date) from my_table where to_timestamp(date)<=DATE '2015-01-01'

答案 1 :(得分:0)

解决方案很简单

select to_date(CAST(date as TEXT), 'YYYYMMDD') from my_table
Where to_date(CAST(date as TEXT), 'YYYYMMDD')<=DATE '20141127' ;

答案 2 :(得分:0)

你应该像这样使用CAST:

WHERE CAST(date AS DATE) <='2015-01-01'

答案 3 :(得分:0)

假设您知道最佳解决方案是将日期字段定义为日期数据类型。还假设您无法控制数据表单,这很常见。

看来你的bigint值的格式为yyyymmdd。这是有道理的,因为它会给出相同的排序顺序,就好像它是一个日期值,并且日期值是人类可读的而没有转换。在这种情况下,显而易见的解决方案是不尝试转换日期值。这将对您检查的每一行应用转换,对于每个查询可能会有数千和数千。

相反,转换搜索值。然后,您只执行一次转换,并将结果应用于成千上万行原始数据。

declare  bigint intdate = date_part( 'year', mydate ) * 10000
                        + date_part( 'month', mydate ) * 100
                        + date_part( 'day', mydate ); --> Performed once
select   ...
from     mytable
where    ...
    and  intdatefield <= intdate;

我将转换和查询显示为单独的操作。您可以将转换直接放在查询的where子句中。它将被执行一次并且结果被缓存 - 因此在性能方面没有区别。这两个步骤更容易理解和维护。

现在您可能需要在结果集中返回日期值。在这里你有一些选择。一种是将整数值转换为查询本身中的日期:

select  To_Date_Fn( intdatefield / 10000, -- year
                    intdatefield / 100 % 100 -- month
                    intdatefield % 100 )  -- day
        as DateField
...

当最终结果集相对于搜索的行数较小时,这很好。您的转化次数要少得多。

或者您可以让应用进行转换。从严格的性能角度来看,这将是最好的,但你可以从应用程序开发人员那里得到反弹。