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

Bra*_*rad 0 php oracle codeigniter

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

日期(db表字段名称调用:submission_date)作为dMy存储在数据库中(例如: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)
Run Code Online (Sandbox Code Playgroud)

Edd*_*wad 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');
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*age 5

当你说,

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

对我来说,该列的数据类型是DATE.

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

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

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

SELECT Submission_date FROM tab 
Run Code Online (Sandbox Code Playgroud)

返回基于客户端设置或NLS设置格式化为字符串的日期.

SELECT Submission_date - 1 FROM tab 
Run Code Online (Sandbox Code Playgroud)

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

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

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

在哪里Submission_date BETWEEN $ Begin和$ End将起作用.

奖金材料

BETWEEN包含两端.

更多奖金材料

日期实际上存储如下:

Byte 1 -> Century
Byte 2 -> Year
Byte 3 -> Month
Byte 4 -> Day
Byte 5 -> Hour
Byte 6 -> Minute
Byte 7 -> Second
Run Code Online (Sandbox Code Playgroud)

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

奖金材料Redux

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

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