SQL日期格式转换

时间:2016-02-18 21:10:58

标签: sql oracle

我对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编写代码。

3 个答案:

答案 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作为前导列)来满足谓词。