从表中检索日期范围之间的项目。
日期(调用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)
答案 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等的转换。
SQL Server将日期存储为两个4字节整数一起打包到BINARY(8)中。前4个字节是自SQL Server基准日期1/1/1900起经过的天数。第二个4字节存储时间表示为午夜后的毫秒数,量子为3.33毫秒。
假设如果可以存储该值,那么RDBMS支持它是错误的。我相信SQL Server根本不处理BC日期,也不会处理9999年的未来日期.MSSS2008确实引入了一种新的数据类型来处理这些大日期。