SQL日期格式转换

14 浏览
0 Comments

SQL日期格式转换

我对SQL日期有一个问题。

我正在处理的表格中有一个日期字段,格式如下:"22-SEP-08"。该字段是一个日期列。

我想知道如何输出从2000年1月1日到现在的记录。

以下代码无法筛选日期字段:

选择不同的实体.lt_date 
从feed.entitytable实体中
其中实体.lt_date >= '2000-01-01'

非常感谢对此问题的任何帮助。谢谢!

编辑:我正在使用Oracle SQL Developer编写我的代码。

0
0 Comments

SQL日期格式转换的问题是由于日期并没有"一个格式"造成的。任何你看到的格式都是应用程序显示日期值时应用的。

你可以改变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');

关于指定日期字面量的更多详细信息可以在手册中找到:

- [日期字面量](http://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062)

- [to_date函数](http://docs.oracle.com/database/121/SQLRF/functions219.htm#SQLRF06132)

原始查询中发生的隐式数据类型转换是从列的DATE数据类型到VARCHAR的转换,以获取一个与字符串字面量进行比较的字符串。Oracle使用NLS_DATE_FORMAT参数的设置作为隐式TO_CHAR函数的第二个参数。这个答案给出了正确的"修复"方法。

0
0 Comments

SQL日期格式转换的问题产生的原因是隐式的数据类型转换。Oracle在执行比较时,会进行从DATE到VARCHAR的隐式数据类型转换,以便将其与字符串字面值进行比较。如果lt_date列是DATE数据类型,那么Oracle会将你的where子句视为:

where entity.lt_date >= '2000-01-01'

实际上Oracle将其视为:

where TO_CHAR(entity.lt_date) >= '2000-01-01'

这就是"格式"问题出现的地方。列本身并没有"格式"。因为TO_CHAR函数的第二个参数没有提供,Oracle使用的是NLS_DATE_FORMAT参数的值(来自你的会话)。而这个参数很可能设置为DD-MON-YY。这就是为什么在SQL*Plus中运行SELECT语句时会看到这个"格式"。因为DATE值(再次)通过TO_CHAR函数转换为可以显示的字符串。

为了实现你想要的"过滤",不要将比较对象设置为字符串字面值,而是将其设置为具有DATE数据类型的表达式。

你可以使用Oracle的TO_DATE函数,并且不要依赖NLS_DATE_FORMAT的设置,要在函数的第二个参数中明确指定格式模型。例如:

DO THIS

where entity.lt_date >= TO_DATE('2000-01-01','YYYY-MM-DD')

而不要这样做

也可以将格式模型作为第二个参数传递给TO_CHAR函数。

where TO_CHAR(entity.lt_date,'YYYY-MM-DD') >= '2001-01-01'

但你不应该这样做,因为这将强制Oracle对左侧的表达式对每一行进行计算,以获得一个字符串值进行比较(除非有人为你创建了一个基于函数的索引)。如果在裸列上进行比较,使用字面值上的TO_DATE函数,Oracle可以有效地利用适当的索引(以lt_date作为前导列)来满足谓词。

关于SQL中隐式类型转换的注意事项,当Oracle遇到包含日期值和字符串字面值之间比较的谓词时,如果可能的话,Oracle会将字符串字面值转换为日期字面值,否则会使用NLS_DATE_FORMAT会话状态值将日期隐式转换为字符串。在这种情况下,NLS_DATE_FORMAT可能为'DD-MON-RR',它与'2001-01-01'字符串不匹配,从而阻止了字符串字面值隐式转换为日期字面值。

0
0 Comments

(SQL Date Format Conversion)问题的出现的原因是数据类型不是日期类型,而是字符类型。解决方法是使用Oracle的TO_DATE()函数将其转换为日期类型。可以参考Oracle的文档以了解TO_DATE()函数的参数。问题的解决方法是在字符串文字上使用TO_DATE()函数。

0