代码之家  ›  专栏  ›  技术社区  ›  AlphaTry

将双精度列转换为日期时舍入人工制品

  •  1
  • AlphaTry  · 技术社区  · 6 年前

    在表中,日期将另存为数据类型 DOUBLE PRECISION .试图将其转换为日期格式,但时间戳大于下午12点时出现的日期不正确。(即,如果时间戳大于或等于,则给出第二天的日期) 12:00:00.000 )

    这是我试过的

    1. 日期栏+演员表(日期:1899年12月30日)
    2. 日期:'1899-12-30'+日期栏

    例子

    SELECT  po.DELIVERYDATE as DOUBLE_FORMAT, 
            po.DELIVERYDATE + CAST ('30.12.1899' AS TIMESTAMP) as DATE_TIMESTAMP_FORMAT, 
            po.DELIVERYDATE + CAST ('30.12.1899' AS DATE) as DATE_FORMAT_1,
            DATE'1899-12-30' + po.DELIVERYDATE   as DATE_FORMAT_2
    FROM    PURCHASE_ORDER po
    

    结果

    DOUBLE_FORMAT    DATE_TIMESTAMP_FORMAT      DATE_FORMAT_1   DATE_FORMAT_2
    -------------    ------------------------   -------------   -------------
    41485.421586     30.07.2013, 10:07:05.000   30.07.2013      30.07.2013
    41488.487419     02.08.2013, 11:41:53.000   02.08.2013      02.08.2013
    41488.489792     02.08.2013, 11:45:18.000   02.08.2013      02.08.2013
    41506.630035     20.08.2013, 15:07:15.000   21.08.2013      21.08.2013 //<-- Incorrect
    41516.514479     30.08.2013, 12:20:51.000   31.08.2013      31.08.2013 //<-- Incorrect
    41521.402963     04.09.2013, 09:40:16.000   04.09.2013      04.09.2013
    41520.511030     03.09.2013, 12:15:53.000   04.09.2013      04.09.2013 //<-- Incorrect
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Arioch 'The    6 年前

    • TIMESTAMP DATE

    select
      41516.514479,                                       -- 41516,514479
      cast( 41516.514479 as integer ),                    -- 41517
      round( 41516.514479 ),                              -- 41517   
      41516.514479 + DATE '1899-12-30',                   -- 31.08.2013
      floor( 41516.514479 ),                              -- 41516   
      floor( 41516.514479 ) + DATE '1899-12-30',          -- 30.08.2013
      41516.514479 + timestamp '1899-12-30',              -- 12:20 30.08.2013
      cast(41516.514479 + timestamp '1899-12-30' as DATE) -- 30.08.2013
    from rdb$database