我对SQL日期有疑问。 我正在使用的表格具有以下格式的日期字段:" 22-SEP-08"。该字段是日期列。
我试图弄清楚如何从2000年1月1日到现在输出记录。
以下代码未过滤日期字段:
Select distinct entity.lt_date
from feed.entitytable entity
where entity.lt_date >= '2000-01-01'
非常感谢有关此问题的任何帮助。谢谢!
编辑:我正在使用Oracle SQL Developer编写代码。
答案 0 :(得分:2)
日期 不 有"格式"。 看的任何格式都由应用程序显示日期值。
您可以更改SQL Developer的配置以使用其他格式显示日期,也可以使用to_char()
按照您希望的方式格式化日期。
您的语句不起作用的原因很可能是因为您依赖的隐式数据类型转换。
'2000-01-01'
是字符串值,而不是日期。并使用会话的NLS设置转换字符串。鉴于您看到显示为DD-MON-YY
的日期意味着这是恶意隐式数据类型转换所使用的格式。您应该将日期值始终作为实际日期文字提供。
指定真实日期文字有两种方法。第一个是ANSI SQL,简单地在ISO格式的字符串前面使用关键字DATE
:
where entity.lt_date >= DATE '2000-01-01'
注意字符串前面的DATE
关键字,它使它成为真正的日期文字,而不是字符串表达式。
另一种选择是使用to_date()
将字符值转换为日期:
where entity.lt_date >= to_date('2000-01-01', 'yyyy-mm-dd');
有关指定日期文字的更多详细信息,请参阅手册:
答案 1 :(得分:0)
我的猜测是数据类型不是日期。如果是char类型,请尝试使用Oracle TO_DATE()函数进行转换。下面的Oracle文档可以为您提供参数帮助。
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions183.htm
答案 2 :(得分:0)
隐式数据类型转换再次出现。
你是对的。谓词没有做你期望的比较,
Oracle正在执行从<{1}}到DATE
的隐式数据类型转换,以便它可以与字符串文字进行比较。
如果VARCHAR
列为lt_date
数据类型,则Oracle会看到您的DATE
子句:
where
Oracle实际上看到它就好像是这样写的:
where entity.lt_date >= '2000-01-01'
&#34;格式&#34;问题进来了。列本身不具有&#34;格式&#34;。由于未提供 where TO_CHAR(entity.lt_date) >= '2000-01-01'
函数的第二个参数,因此Oracle使用TO_CHAR
参数的值(来自您的会话)。这可能设置为NLS_DATE_FORMAT
。这就是&#34;格式&#34;您在SQL * Plus中运行SELECT语句时会看到什么。因为DD-MON-YY
值(再次)通过DATE
函数运行以获取可以显示的字符串。
获得&#34;过滤&#34;你想要的,不要对字符串文字进行比较。相反,请与具有TO_CHAR
数据类型的表达式进行比较。
您可以使用Oracle DATE
功能。并且您不想依赖TO_DATE
的设置,明确指定格式模型作为函数的第二个参数。例如:
DO THIS
NLS_DATE_FORMAT
不要做这个
也可以将格式模型指定为where entity.lt_date >= TO_DATE('2000-01-01','YYYY-MM-DD')
函数的第二个参数。
TO_CHAR
但是你不想这样做,因为这会迫使Oracle在表格中的每个翻转行的左侧评估该表达式,因此它有一个字符串值来进行比较。 (除非有人为您创建了基于函数的索引,否则这是真的。)如果您在裸列上进行比较,使用文字方面的where TO_CHAR(entity.lt_date,'YYYY-MM-DD') >= '2001-01-01'
,Oracle可以有效地使用适当的索引(以TO_DATE
作为前导列)来满足谓词。