使用 TO_CHAR 函数格式化时 SQL Developer 返回不正确的日期

问题描述 投票:0回答:1

我正在使用查询根据某些条件从表中检索一些数据。下面提到了查询。

当我使用 TO_CHAR 函数显示 empcheckin 时间时指定了相同的格式

尝试过:

  1. 在(工具>首选项>数据库>NLS>日期格式)中将默认日期格式设置为DD-MON-YY HH24:MI:SS
  2. 使用 TO_CHAR 函数的查询以相同的格式显示数据
    TO_CHAR(E.EMPCHECKIN, 'DD-MON-YY HH24:MM:SS') <= TO_CHAR('24-APR-24 11:35:00')
  3. 查询:
    SELECT L.LOCKUNLOCKID, E.EMPID, TO_CHAR(E.EMPCHECKIN, 'DD-MON-YY HH24:MM:SS'), S.N_SATOFF, e.empcheckin FROM LOCKUNLOCKEMPLDAP L JOIN EMPLOGINDTLS E ON E.EMPID=L.EMPID JOIN SATOFF S ON S.EMPID=L.EMPID WHERE TRUNC(L.PROCESS_DATE)=TRUNC(SYSDATE) AND  TRUNC(E.EMPCHECKIN)>='22-APR-24' AND TRUNC(E.EMPCHECKIN) != E.EMPCHECKIN  ORDER BY E.EMPID;

预期输出: 表两列中的数据相同,即 第 1 列(e.empcheckin)|第 2 栏 (

TO_CHAR(E.EMPCHECKIN, 'DD-MON-YY HH24:MM:SS'
) 24 年 4 月 24 日 11:42:28 | 24 年 4 月 24 日 11:42:28

实际输出: [SQL Developer 查询结果请参考此图]:https://i.stack.imgur.com/LexAX.png 数值不一样,相差 40 分钟。

在这里,您可以观察到 empcheckin 的两个值之间存在很大差异。 可能是什么原因造成的?我该如何解决?

还有支线任务: 帮我写下条件,以便我可以将 EMPCHECKIN 中的时间戳与 11:35:00 进行比较 我也尝试使用 TO_CHAR 函数,但我不确定它是否可以正确比较日期。

TO_CHAR(E.EMPCHECKIN, 'DD-MON-YY HH24:MM:SS') <= TO_CHAR('24-APR-24 11:35:00')

oracle date-formatting to-char
1个回答
0
投票

... TO_CHAR(E.EMPCHECKIN, 'DD-MON-YY HH24:MM:SS') ...

您已在

MM
中使用了
'DD-MON-YY HH24:MM:SS'
格式元素两次。这就是为什么输出中的“分钟”部分显示为
04
- 因为这是四月的月份数字。

应该是:

TO_CHAR(E.EMPCHECKIN, 'DD-MON-YY HH24:MI:SS')

你也在做:

WHERE TRUNC(L.PROCESS_DATE)=TRUNC(SYSDATE)
AND  TRUNC(E.EMPCHECKIN)>='22-APR-24' 

您并不真的想截断列值,因为对列应用函数将停止正在使用的列上的任何普通索引。对于第二行,如果该条件为真,则被截断则为真。对于第一行,如果

process_date
将来不可能出现,情况也会如此;如果它可以进行范围检查。

WHERE L.PROCESS_DATE >= TRUNC(SYSDATE)
AND L.PROCESS_DATE < TRUNC(SYSDATE) + 1 -- only needed if process_date can be in the future 
AND E.EMPCHECKIN >= DATE '2024-04-22'

将 EMPCHECKIN 中的时间戳与 11:35:00 进行比较

如果您想要该检查的上限 - 看起来您的固定值尝试正在做 - 那么您可以这样做:

AND E.EMPCHECKIN <= TRUNC(SYSDATE) + INTERVAL '11:35' HOUR TO MINUTE

AND E.EMPCHECKIN < TRUNC(SYSDATE) + INTERVAL '11:35:01' HOUR TO SECOND
© www.soinside.com 2019 - 2024. All rights reserved.