我的约会是bigint类型。 我该如何选择日期?
获取日期的典型查询就像这样
select date from my_table where date<='20150101'
现在的问题是,日期属于bigint类型
答案 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
...
当最终结果集相对于搜索的行数较小时,这很好。您的转化次数要少得多。
或者您可以让应用进行转换。从严格的性能角度来看,这将是最好的,但你可以从应用程序开发人员那里得到反弹。