2013-06-18 194 views
0

在我的项目中,我正在生成和存储帐单(发票)。 比尔的日期在保存前从javascript日期选择器(小弹出式日历)进入文本框。 日期格式为:DD-MON-YYYY(2013年6月18日)。在MySql数据库中使用PHP在两个日期之间选择记录

我正在使用''文本'数据类型在MySql表中存储日期。

我已经完成了从给定的单一日期类似的表中选择记录(前票据)。 。 。

$ result = mysql_query(“SELECT * FROM outward WHERE date ='”。$ date。“'ORDER BY billNo”);现在

,我想要做的是: 两个日期之间选择记录(票据).....

我确切的问题是: 是否有可能查询MySQL数据库与此设置或我必须做出一些更改,以有效地选择2日期之间的记录? 我怎样才能做到这一点?

P.s. - 是否有效使用
1.“SELECT * FROM WHERE date BETWEEN'”。 $ from_date。 “'AND'”。 $ to_date。 “” ORDER BY ID DESC”
或者
2. SELECT * FROM向外WHERE日期> “15-JUN-2013”​​ 和日期< “18-JUN-2013”​​

+0

'DATE'或'DATETIME'类型的日期列是? –

+0

您必须更改日期格式才能使用日期字段yyyy-mm-dd – amigura

回答

0

您应该使用strtotime PHP函数将字符串日期转换为UNIX时间戳格式,并将日期字段的MySQL数据类型更改为TIMESTAMP

比你可以用><做有效的查询。

0

如果它是一个DATE列,您可以使用此获得2013 6月15日和2013年6月18日(含)之间的所有日期:

WHERE date BETWEEN '2013-06-15' AND '2013-06-18' 

如果它是一个DATETIME列,而是执行此操作:

WHERE date >= '2013-06-15' AND date < '2013-06-19' 

如果对date列进行索引,则此方法将确保索引可用于优化。如果它没有编入索引,那么这种方法与其他许多方式一样快。

附录:刚刚在所有其他喊叫信息中看到了“存储为文本”。请注意,只有在类型为DATEDATETIME时,此答案才适用。我会留下它,因为最好的答案是更改列的数据类型,然后使用这个或其他建议的选项之一。

0

我正在使用'文本'数据类型在MySql表中存储日期。

这是一个问题。您应该在MySQL中将日期存储为datedatetime数据类型。如果你不在乎时间部分,date应该足够。

如果你改变你的数据类型为日期,然后这样做:

select x,y,z from table a where a.datecolumn between @startdate and @enddate 

应该正常工作。

如果您使用文本数据类型,则必须将该列转换为日期列,然后应用日期选择范围,该范围由于演员表而变慢。

始终将数据存储在与其种类相匹配的数据类型中。如果是日期然后是日期列,是文本还是文本或varchar等。您的应用的表示层可能会担心格式,其中该数据会呈现给用户。

0

你说你使用TEXT列来存储日期。这是一个非常糟糕的主意。如果您切换到DATEDATETIME,那么这将变得微不足道。

1

您可以用纯SQL方式来完成,但是您将不得不为每个查询执行全表扫描。

select the_dates, 
    STR_TO_DATE(the_dates, '%d-%M-%Y') as converted 
from testing 
    where STR_TO_DATE(the_dates, '%d-%M-%Y') between '2013-06-20' and '2013-06-23' 

Link to SQLFiddle

+0

这是更正的答案,但我不会使用它,因为将日期存储为文本没有任何意义。正如Brian指出,这个查询不是那么快 – Pinoniq

+0

@Pinoniq - 我希望我会在将日期字段存储为文本之前被拍摄:) –

+0

我会看看我能做什么;) – Pinoniq

0

既然你是把它作为文本,但你要SQL解析它作为一个日期SQL不首先明白。

在你的例子中,SQL将使用TEXT比较规则。所以15-April < 15-Mar> 15-DEC

如果您要在SQL数据库中存储日期,则应该将其存储为日期而不是TEXT。

相关问题