Oracle截止日期未保留格式
因为这似乎更像是一个语法问题,所以我的搜索没有产生任何有用的结果 我正在尝试使用GMT时间从美国数据库中获取欧洲数据。我需要欧洲时间,但似乎无法正常工作 假设“myDateField”=“01-01-2010”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 /
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”