【发布时间】:2016-09-07 22:04:26
【问题描述】:
我有一张表,其中日期列包含以下格式的数据: “7/25/2014 12:14:27 AM'。我需要通过放入 where 子句来获取这个日期。谁能建议我该怎么做?
【问题讨论】:
-
日期列没有格式;它是日期还是 varchar 列?
标签: oracle where-clause date-format
我有一张表,其中日期列包含以下格式的数据: “7/25/2014 12:14:27 AM'。我需要通过放入 where 子句来获取这个日期。谁能建议我该怎么做?
【问题讨论】:
标签: oracle where-clause date-format
日期(存储在表格中)为represented by 7 bytes - 它们没有任何与之关联的格式。如果它们被格式化为字符串,那么这就是您用来访问数据库的客户端程序,将其自己的格式应用于日期(您通常可以通过该程序中的首选项进行设置)。
如果“日期”以某种格式存储,那么您不是将其存储为日期,而是将其存储为字符串(即VARCHAR2)格式。
查询 - 如果日期存储为日期:
SELECT *
FROM table_name
WHERE date_column = TO_DATE( '7/25/2014 12:14:27 AM', 'MM/DD/YYYY HH12:MI:SS AM' )
或者,使用 ANSI/ISO 文字:
SELECT *
FROM table_name
WHERE date_column = TIMESTAMP '2014-07-25 00:14:27'
或者,如果您想要特定日期的值,那么:
SELECT *
FROM table_name
WHERE date_column >= DATE '2016-05-12'
AND date_column < DATE '2016-05-13'
(这将允许您使用 date_column 列上的任何索引。)
或者,只传递一个日期值(由绑定变量:date_value 表示):
SELECT *
FROM table_name
WHERE date_column >= :date_value
AND date_column < :date_value + INTERVAL '1' DAY
查询 - 如果“日期”存储为字符串:
SELECT *
FROM table_name
WHERE TO_DATE( date_as_a_string_column, 'MM/DD/YYYY HH12:MI:SS AM' )
= TIMESTAMP '2014-07-25 00:14:27'
或者,简单地说:
SELECT *
FROM table_name
WHERE date_as_a_string_column = '7/25/2014 12:14:27 AM'
【讨论】:
TO_CHAR(RECORD_UPDATE_DT, 'MM/DD/YYYY') 上有基于函数的索引),因此性能会降低。最好将右侧(即文字值)转换为日期。
您看到的日期格式很可能是您的 SQL 工具(SQLplus、SQL Developer、Toad 等)使用的格式。正确的日期列没有关联的日期格式。
要编写可靠的按日期选择查询,请在查询中明确指定日期格式(否则 Oracle 我们会使用您当前会话中的日期格式):
SELECT * FROM T1
WHERE DATE_COL > TO_DATE('7/25/2014 12:14:27 AM', 'MM/DD/YYYY HH:MI:SS AM');
任何其他日期格式也可以:
SELECT * FROM T1
WHERE DATE_COL > TO_DATE('2014-07-25 12:14:27', 'YYYY-MM-DD HH24:MI:SS');
【讨论】: