Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle截止日期未保留格式_Oracle - Fatal编程技术网

Oracle截止日期未保留格式

Oracle截止日期未保留格式,oracle,Oracle,因为这似乎更像是一个语法问题,所以我的搜索没有产生任何有用的结果 我正在尝试使用GMT时间从美国数据库中获取欧洲数据。我需要欧洲时间,但似乎无法正常工作 假设“myDateField”=“01-01-2010” SELECT TO_CHAR(myDateField + (60 / 1440), 'Mon" "DD", "YYYY') 生产出我想要的东西,但我需要它作为约会的对象。 制作:“2010年1月1日” SELECT TO_DATE(TO_CHAR(myDateField + (60 /

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

我正在尝试使用GMT时间从美国数据库中获取欧洲数据。我需要欧洲时间,但似乎无法正常工作

假设“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')
工作正常,但格式已丢失。
生产:“01-01-2010

SELECT TO_DATE(TO_CHAR(myDateField + (60 / 1440)), 'Mon" "DD", "YYYY')
我如何格式化它,以便我可以得到第一个语句给出的结果,但也可以将其保留为日期?还是有更好的方法

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

SELECT TO_DATE(TO_CHAR(NEW_TIME(myDateField, 'GMT', 'MDT')), 'Mon" "DD", "YYYY')
生成我想要的内容,同时将数据保留为日期。
制作:“2010年1月1日”

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


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

我认为重要的是要认识到,您所需的格式在从
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'
)

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

我认为重要的是要认识到,在从
日期
转换为
字符
类型时,所需的格式会生效。因此,您的要求“设置格式但将其保留为日期”没有意义——在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'
)

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

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

一种方法是简单地查询日期,并让客户机程序格式化它。例如,在Java中,可以使用DateFormat类

但您也可以尝试
ALTER SESSION SET NLS\u DATE\u FORMAT='Mon-dd,yyyy'

这也许行得通


编辑:您的第二次查询为我返回了一个
不是有效月份的错误。您是在遵循我的
ALTER SESSION
建议之后运行的吗?

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

一种方法是简单地查询日期,并让客户机程序格式化它。例如,在Java中,可以使用DateFormat类

但您也可以尝试
ALTER SESSION SET NLS\u DATE\u FORMAT='Mon-dd,yyyy'

这也许行得通


编辑:您的第二次查询为我返回了一个
不是有效月份的错误。您是在遵循我的
ALTER SESSION
建议之后运行的吗?

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

你问有没有更好的办法。我认为有:使用oracle时区支持

见:

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

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;

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

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

你问有没有更好的办法。我认为有:使用oracle时区支持

见:

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

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;

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

谢谢您的建议。。。在这种情况下,不需要时间。不过,感谢您提供的见解,我将使用一个查询来更新这个问题,该查询在类似的情况下确实可以正常工作,唯一的例外是它在中使用了“NEW_TIME”