TO_DATE为不同的格式掩码返回不同的日期?

时间:2012-12-18 13:30:21

标签: sql oracle to-date

我正在查询下面的sql。 请帮我。

 select to_date(sysdate, 'DD MONTH YYYY') , to_date(sysdate, 'yyyy/mm/dd hh24:mi:ss')
 from dual where 
 to_date(sysdate, 'DD MONTH YYYY') < to_date(sysdate, 'yyyy/mm/dd');

1)to_date(sysdate,'DD MONTH YYYY')这将给Date对象没有时间(可能是00:00)。我对吗?如果不是我将如何只获得没有时间的Date对象?
2)从上面的查询看来to_date(sysdate,'yyyy / mm / dd')大于to_date(sysdate,'DD MONTH YYYY')。为什么??



更新


1)我在上述URL中的目的是找出to_date函数只返回日期(或与时间一起)虽然格式'DD MONTH YYYY'没有提及时间字符(hh:mm ..)。
2)从响应我得到to_date将返回日期与时间总是虽然我们没有提到时间字符。
3)最后只获得DATE我们应该使用trunc()/ to_date(to_char(sysdate,'mm-dd-yyyy'),'mm-dd-yyyy')

检查以下

select to_char(trunc(sysdate), 'yyyy/mm/dd hh24:mi:ss'), 
to_char(to_date(to_char(sysdate, 'yyyy-MM-dd'),'yyyy/mm/dd hh24:mi:ss'),'yyyy/mm/dd hh24:mi:ss') 
from dual;

- &gt; hh24:24对于获得00:00格式很重要。

3 个答案:

答案 0 :(得分:8)

你刚刚开始自杀。它被称为隐式数据类型转换。

没有TO_DATE(date)(这就是你要求的),所以oracle已将你的查询转换为TO_DATE(TO_CHAR(sysdate), 'DD MONTH YYYY'),其中TO_CHAR(sysdate)将获取默认的NLS格式掩码。根据您的默认掩码(请参阅NLS_SESSION_PARAMETERS),您的第一个可能已经解决到年份0012和第二个到0018年。所以0012小于0018。

如果要截断sysdate,请执行trunc(sysdate)

答案 1 :(得分:1)

如果要在选择SYSDATE时查看时间部分。您可以在发出SELECT语句之前设置NLS_DATE_FORMAT。

ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy-mm-dd hh24:mi:ss';

在IDE中(今天,PLSQL Developer,SQL Developer等) NLS_DATE_FORMAT 可以永久设置为由您执行的每个select语句使用。在这种情况下,您不需要在SELECT之前运行 ALTER SESSION 命令。

答案 2 :(得分:0)

广告。 1.在我的测试环境中,我得到了约会时间:

select to_date('15 Maj 1998', 'DD MONTH YYYY') from dual;

结果(波兰语设置):

1998-05-15 00:00:00

广告。 2.为什么在致电sysdate时使用to_date?此函数需要以给定格式描述日期时间的字符串。在我的环境中,此类调用失败。您可能有其他NLS设置,因此可以将sysdate强制转换为字符串,这样的字符串会给您带来奇怪的结果。使用字符串,而不是sysdate