我正在查询下面的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格式很重要。
答案 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
。