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

Oracle截止日期未保留格式

  •  1
  • Sivvy  · 技术社区  · 15 年前

    因为这似乎更像是一个语法问题,所以我的搜索没有产生任何有用的结果。

    假设“myDateField”=“01-01-2010”

    SELECT TO_CHAR(myDateField + (60 / 1440), 'Mon" "DD", "YYYY')
    

    生产出我想要的东西,但我需要它作为约会的对象。
    生产:' 2010年1月1日 '

    SELECT TO_DATE(TO_CHAR(myDateField + (60 / 1440)), 'Mon" "DD", "YYYY')
    

    存在“无效月份”错误。
    生产: 错误

    SELECT TO_DATE(TO_CHAR(myDateField + (60 / 1440), 'Mon" "DD", "YYYY'), 'Mon" "DD", "YYYY')
    


    生产:' '

    我如何格式化它,以便我可以得到第一个语句给出的结果,但也可以将其保留为日期?还是有更好的方法?


    作为一个在不同环境下工作的特定查询的示例。。。这是相同的查询,但它不是转换为欧洲时间,而是转换为北美的另一个时区。

    SELECT TO_DATE(TO_CHAR(NEW_TIME(myDateField, 'GMT', 'MDT')), 'Mon" "DD", "YYYY')
    


    2010年1月1日 '

    有没有办法采用“myDateField+(60/1440)”或使用“FROM_TZ”关键字,并使结果使用“Mon”、“DD”、“YYYY”格式,同时保留其日期类型?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Roland Bouman    15 年前

    新的答案,因为第一个解决了日期和字符的混淆,而不是时区。

    见: http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch4datetime.htm#i1006333

    将日期时间转换为其他时区的查询示例:

    SELECT FROM_TZ(
             CAST(TO_DATE('1999-12-01 11:00:00','YYYY-MM-DD HH:MI:SS') AS TIMESTAMP)
           , 'America/New_York'
           )
           AT TIME ZONE 'America/Los_Angeles' "West Coast Time"
    FROM DUAL;
    

    SELECT TO_CHAR(
             FROM_TZ(
               CAST(TO_DATE('1999-12-01 11:00:00','YYYY-MM-DD HH:MI:SS') AS TIMESTAMP)
             , 'America/New_York'
             )
             AT TIME ZONE 'America/Los_Angeles' 
           , 'MON DD, YYYY') "West Coast Time"
    FROM DUAL;
    

    …但正如我在第一个答案中指出的,这里的结果将是字符,而不是日期。

        2
  •  4
  •   Roland Bouman    15 年前

    DATE CHAR 类型。因此,您的要求“设置格式但将其保留为日期”没有意义——在Oracle中没有。

    如果您只想为日期添加一些时间间隔,并将其保留为日期,则只需执行以下操作:

    myDateCol + (60 / 1440) -- add one hour to the date
    

    如果你想用欧洲风格来编排,它就变成了

    TO_CHAR(myDateCol + (60 / 1440), 'MON DD, YYYY')
    

    当然,您可以将其转换回一个日期:

    TO_DATE(TO_CHAR(myDateCol + (60 / 1440), 'MON DD, YYYY'), 'MON DD, YYYY')
    

    但是说真的-没有意义-因为时间部分不在字符串中,所以这个日期实际上有00:00:00作为时间。所以你只是丢失了信息。

    TO_CHAR(myDateCol + (60 / 1440), 'MON DD, YYYY HH24:MI:SS')
    

    比较一下:

    TO_CHAR(
      TO_DATE(
        TO_CHAR(myDateCol + (60 / 1440), 'MON DD, YYYY HH24:MI:SS')
      , 'MON DD, YYYY'
      )
    , 'MON DD, YYYY HH24:MI:SS'
    )
    

    (最后一个表达式演示了如何截断时间域)

        3
  •  3
  •   Dan    15 年前

    日期只是一个日期,它没有固有的字符串格式。它的确有一种默认格式,也就是说,当您将日期查询到某个程序或库中,并将其提取为字符串时,会有一个默认设置来设置其格式。

    但你也可以试试 ALTER SESSION SET NLS_DATE_FORMAT = 'Mon dd, yyyy'

    编辑:您的第二个查询返回了一个 not a valid month 对我来说是个错误。你是在跟踪我的计划后做的吗 ALTER SESSION 建议?