4

我正在查询以下 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;

-->hh24 :24 对于获取 00:00 格式很重要。

4

3 回答 3

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)

于 2012-12-18T13:41:17.083 回答
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命令。

于 2018-01-31T09:43:25.417 回答
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.

于 2012-12-18T13:46:51.023 回答