【问题标题】:Issue with Fetching Date using SYSDATE?使用 SYSDATE 获取日期的问题?
【发布时间】:2012-06-30 21:41:58
【问题描述】:

我有一个包含 EMP_DATE 列的表结构,如下所示

 ID       EMP_DATE
----    -----------
5400     14-FEB-2012

我已将记录插入到下表中

INSERT INTO TEST_DATE VALUES(5400,SYSDATE);

在我尝试获取拥有EMP_DATE 的人的记录时插入记录后 作为SYSDATE,它没有选择任何行。 暂时让SYSDATE 为'01-JUL-2012`

 SELECT * FROM TEST_DATE WHERE EMP_DATE = SYSDATE;
                (OR)
 SELECT * FROM TESt_DATE WHERE EMP_DATE = '01-JUL-2012';

我无法找到任何解决方案。 任何建议都会有所帮助。

【问题讨论】:

    标签: sql oracle sysdate


    【解决方案1】:

    主要问题是日期包括小时、分钟和秒,这是您不允许的。如果你想要一天的所有东西,你可以使用trunc 函数来得到这个:

    SELECT * FROM TEST_DATE WHERE trunc(EMP_DATE) = trunc(SYSDATE);
    

    默认情况下,trunc 在对日期列进行操作时会删除日期的时间部分。我通常会在trunc(emp_date) 上推荐一个功能索引,以优化此查询。比如:

    create index i_test_date on test_date(trunc(emp_date));
    

    我构建了一个小SQL Fiddle 来演示这一点。

    还有一个问题;尽管 Oracle 确实支持 ANSI 日期文字,但您的第二个查询是错误的。 总是,使用to_date 函数将字符串显式转换为日期。

    SELECT * FROM TEST_DATE WHERE EMP_DATE = to_date('01-07-2012','dd-mm-yyyy');
    

    我使用了mm datetime format model 而不是mon,因为不能保证JUL 总是意味着七月;这取决于您的 NLS 参数、您的特定数据库或会话使用的“日期语言”。日期时间格式模型是您如何告诉数据库您传递的要转换为日期的任何字符串的格式。


    如果您对第二个查询的 ANSI 语法感兴趣,您可以:

    SELECT * FROM TESt_DATE WHERE trunc(EMP_DATE) = DATE '2012-07-01'
    

    必须采用这种格式 (YYYY-MM-DD) 才能工作。

    【讨论】:

    • 感谢本的建议!因此,当我使用 SYSDATE 插入日期时,它会相应地存储日期和时间。并获取相同的我需要截断日期以获得结果吗?
    • @Aspirant,如果您想要当天的每个结果,可以。不要忘记sysdate 是不断变化的,因此一旦您插入记录并尝试选择它,sysdate 将在几秒钟内“勾选”并且日期不会准确 一样。玩一玩,自己看看:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多