【问题标题】:How to ceil/floor the float value of datetime如何上限/下限日期时间的浮点值
【发布时间】:2014-12-25 03:17:07
【问题描述】:

对于最小情况

如果 min(ticktime)::TIMESTAMP 是 2014-01-02 01:14:45.5 ,我想将其转换为 2014-01-02 01:14:45

对于最大情况

如果 max(ticktime)::TIMESTAMP 是 2014-01-02 01:14:45.5 ,我想将其转换为 2014-01-02 01:14:46

    SELECT DISTINCT ON (1) generate_series ( min(ticktime)::TIMESTAMP, max(ticktime)::TIMESTAMP, '1 second'::interval) AS ticktime
    FROM cffexes

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    您可以像这样将结果转换为更少的timestamp:

    SELECT DISTINCT ON (1) generate_series ( 
        min(ticktime)::TIMESTAMP(0), 
        max(ticktime)::TIMESTAMP(0)+1, 
        '1 second'::interval) AS ticktime
    FROM cffexes;
    

    如果您想要除秒以外的时间下限/上限,请使用date_trunc()。

    当然,这会留下一个非常小的漏洞,如果max(ticktime) 恰好是一个偶数秒,那么您将生成一个太多的漏洞。所以你可以试试这个,但要意识到浮点值对等式是出了名的不友好。

    SELECT DISTINCT ON (1) generate_series ( 
        min(ticktime)::TIMESTAMP(0), 
        max(ticktime)::TIMESTAMP(0) + (max(ticktime)::TIMESTAMP(0)=max(ticktime)::TIMESTAMP)::int,
        '1 second'::interval) AS ticktime
    FROM cffexes;
    

    【讨论】:

      【解决方案2】:

      我只是在 generate_series 的开头添加 date_trunc,

      它适用于我的

            SELECT DISTINCT ON (1) generate_series
            (
              date_trunc('second', min(ticktime)::TIMESTAMP),
              max(ticktime)::TIMESTAMP,
              '1 #{frequence}'::interval
            ) AS ticktime FROM #{market} WHERE product_type ='#{product_type}' AND contract_month = '#{contract_month}'::timestamp
      

      【讨论】:

        猜你喜欢
        • 2021-06-05
        • 2014-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-10
        • 2021-08-15
        相关资源
        最近更新 更多