在sql中转换日期以比较日期

时间:2010-12-21 22:03:30

标签: php oracle codeigniter

从表中检索日期范围之间的项目。

日期(调用db表字段名称: submission_date )作为d-M-y存储在数据库中(例如:21-Dec-10

它以sysdate的形式存储在oracle数据库中。 (它需要以该格式保留在数据库中,因此不能选择更改存储方式的格式)

我想将21-Dec-10转换为20101221,因此我可以将其与用户发布的日期进行比较,这是两个值,end_date,begin_date

我只需要将 submission_date 正确转换为 Ymd 20101221

下面是理论上我想做的事情:

select 
 * 
from 
 table 
where 
 (convert(Ymd=>submission_date) >= $begin_date 
AND 
 convert(Ymd=>submission_date) <= $end_date)

2 个答案:

答案 0 :(得分:5)

如果列submission_date是DATE数据类型而$ begin_date和$ end_date是yyyymmdd格式的字符串,那么您可以使用以下查询来检索介于日期范围之间的行:

SELECT *
  FROM tab
 WHERE submission_date BETWEEN 
        TO_DATE ( $begin_date, 'yyyymmdd') AND 
        TO_DATE ( $end_date, 'yyyymmdd');

通过在submission_date上应用函数,如果索引存在,我们给Oracle一个机会在该列上使用索引。

答案 1 :(得分:5)

当你说,

  

它以sysdate的形式存储在oracle数据库中。

对我而言,该列的数据类型为DATE。

首先让我们消除DATE存储在Oracle内部的String FORMAT中的概念。这完全是错误的。

如果列的数据类型为DATE,则实际值使用7bytes存储,但可以将其视为数字。当您查询它以检查值时,您会看到dd-mon-yy格式是NLS设置或客户端选项的函数。记住Oracle是一个服务器,任何让你查看存储在那里的信息的工具都有一个访问该信息的门户。换句话说,你并没有真正关注数据,你正在查看已经获得数据的内容,然后将其放在屏幕上供您查看。有意义吗?

好的,现在您知道没有DATE以某种格式存储的东西,DATE MATH变得简单。

SELECT Submission_date FROM tab 

根据客户端设置或NLS设置返回格式化为字符串的日期。

SELECT Submission_date - 1 FROM tab 

返回一天中同一时间的日期

注意我没有必要对数字1做疯狂的事情来执行日期数学,这是因为date数据类型支持数学处理,就像它是一个数字所以减法是一件简单的事情。

如果$ begin_date的变量作为日期传递给Oracle,那么他们也不需要对它们做任何事情,因为它们可以像数字一样使用。

在哪里Submission_date BETWEEN $ Begin AND $ End将起作用。

奖金材料

BETWEEN包含两端。

更多奖励材料

日期实际上是这样存储的:

Byte 1 -> Century
Byte 2 -> Year
Byte 3 -> Month
Byte 4 -> Day
Byte 5 -> Hour
Byte 6 -> Minute
Byte 7 -> Second

这允许支持极其广泛的日期范围。它实际上是日期数学库,可以使该数据类型做一些很酷的事情,如添加闰年并获得从Julian到Gregorian等的转换。

Bonus Material Redux

SQL Server将日期存储为两个4字节整数一起打包到BINARY(8)中。前4个字节是自SQL Server基准日期1/1/1900起经过的天数。第二个4字节存储时间表示为午夜后的毫秒数,量子为3.33毫秒。

假设如果可以存储该值,那么RDBMS支持它是错误的。我相信SQL Server根本不处理BC日期,也不会处理9999年的未来日期.MSSS2008确实引入了一种新的数据类型来处理这些大日期。