0

在我的项目中,我正在生成和存储账单(发票)。比尔的日期在保存之前从 javascript 日期选择器(小型弹出日历)进入文本框。 日期格式为:DD-MON-YYYY (18-JUN-2013)。

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

我已经按照给定的单个日期从表中选择了记录(以前的账单)。. .

$result = mysql_query("SELECT * FROM outside WHERE date='".$date."' ORDER BY billNo");

现在,我想做的是: 在两个日期之间选择记录(账单).....

我的确切问题是: 是否可以使用此设置查询 mysql 数据库,或者我必须进行一些更改才能有效地选择两个日期之间的记录?我怎样才能做到这一点?

Ps - 使用
1. "SELECT * FROM outside WHERE date BETWEEN '" 是否有效。$from_date 。“' 和 '” 。$to_date 。"' ORDER by id DESC"

2. SELECT * FROM outside WHERE date > "15-JUN-2013" and date <"18-JUN-2013"

4

6 回答 6

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'

链接到 SQLFiddle

于 2013-06-18T19:14:37.933 回答
0

由于您将其存储为文本,但您希望 SQL 将其解析为 DATE SQL 首先不理解。

在您的示例中,SQL 将使用 TEXT 比较规则。所以 4 月 15 日 < 3 月 15 日 > 15 月 15 日

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

于 2013-06-18T19:15:28.683 回答
0

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

比您可以使用>和进行有效查询<

于 2013-06-18T19:11:34.953 回答
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。我将保留它,因为最好的答案是更改列的数据类型,然后使用此选项或其他建议选项之一。

于 2013-06-18T19:11:46.783 回答
0

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

那是个问题。您应该在 MySQL 中将日期存储为date或数据类型。datetime如果你不关心时间部分,date应该足够了。

如果您将数据类型更改为日期,则执行以下操作:

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

应该可以正常工作。

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

始终以与其类型匹配的数据类型存储数据。如果是日期,则为日期列,如果是文本,则为文本或 varchar,等等。您的应用程序的表示层可以担心此数据呈现给用户的格式。

于 2013-06-18T19:12:14.797 回答
0

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

于 2013-06-18T19:12:41.160 回答