我将日期作为 varchar 存储在数据库中。当我尝试使用between
sql 中的运算符访问某些数据以获取某些日期之间的某些值时,它没有给出正确的输出,因为我将日期存储为 varchar。日期就是这种格式(01/12/2013)(dd/mm/yyyy)
。
在不将日期从 varchar 更改为日期格式的情况下使用 between 语句访问正确数据的任何想法?
谢谢你。
不要对数据类型感到困惑——它与您的问题无关。如果您删除日期中的 /,您会看到这一点 - 获得实数:20/02/2013 实际上比 01/02/2014 高出 2100 万多
2013 年 2 月 20 日 = 20022013 年1 月 2 日 2014
= 1022014
如果您的 varchar 的数字按日期、月份、年份的顺序排列 - 您必须在字段或查询中对它们重新排序以获得正确的值,但如果它们在年月日中,您将有一个 varchar 仅排序像一个日期时间。
解决方案 1: 如果您必须将其保留在表格中,您必须这样做:
数据库表:
CREATE TABLE `dates` (
`date_varchar` varchar(15) DEFAULT NULL,
`date_datetime` datetime DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
数据:
date_varchar date_datetime
01/02/2013 2013-02-01 00:00:00
02/02/2013 2013-02-02 00:00:00
03/02/2013 2013-02-03 00:00:00
03/02/2014 2014-02-03 00:00:00
03/03/2013 2013-03-03 00:00:00
04/02/2013 2013-02-04 00:00:00
05/02/2013 2013-02-05 00:00:00
查询:
SELECT *
FROM dates
WHERE STR_TO_DATE(date_varchar,'%d/%m/%Y')
BETWEEN '2013-02-03' AND '2013-02-04'
将返回两条记录:
date_varchar date_datetime
03/02/2013 2013-02-03 00:00:00
04/02/2013 2013-02-04 00:00:00
解决方案 2:
将 varchar 中的顺序更改为字段中的年、月、日。见下表数据:
date_varchar date_datetime
2013/02/01 2013-02-01 00:00:00
2013/02/02 2013-02-02 00:00:00
2013/02/03 2013-02-03 00:00:00
2013/02/04 2013-02-04 00:00:00
2013/02/05 2013-02-05 00:00:00
2013/03/03 2013-03-03 00:00:00
2014/02/03 2014-02-03 00:00:00
现在您可以选择:
SELECT *
FROM dates
WHERE date_varchar
BETWEEN '2013/02/02' AND '2013/02/03'
现在数字的排序方式与日期时间相同 - 您只需删除 / 和 - 即可查看数字。所以 varchars 的排序与 date_time 相同
查询返回相同的两行:
date_varchar date_datetime
2013/02/02 2013-02-02 00:00:00
2013/02/03 2013-02-03 00:00:00
解决方案 3:
这不适合您,因为您不想更改表格,但我将其包括在内以使其完整。通过将数据类型更改为 datetime,您必须将数字按正确的顺序排列,并使用此查询来获取日期之间的范围:
SELECT *
FROM dates
WHERE date_datetime
BETWEEN '2013-02-03' AND '2013-02-04'
同样的两条记录:
date_varchar date_datetime
03/02/2013 2013-02-03 00:00:00
04/02/2013 2013-02-04 00:00:00
问题示例:
现在只需选择日期作为 varchar 返回 - 你猜对了 - 就像第一个查询和更多一样的两条记录,就像发生在你身上的事情一样:
数据:
date_varchar date_datetime
01/02/2013 2013-02-01 00:00:00
02/02/2013 2013-02-02 00:00:00
03/02/2013 2013-02-03 00:00:00
03/02/2014 2014-02-03 00:00:00
03/03/2013 2013-03-03 00:00:00
04/02/2013 2013-02-04 00:00:00
05/02/2013 2013-02-05 00:00:00
SELECT *
FROM dates
WHERE date_varchar
BETWEEN '03/02/2013' AND '04/02/2013'
date_varchar date_datetime
03/02/2013 2013-02-05 00:00:00
03/02/2014 2014-02-03 00:00:00
03/03/2013 2013-02-05 00:00:00
04/02/2013 2013-02-03 00:00:00
您将日期存储为 varchar,然后使用 to_date 函数转换为日期格式,然后在运算符之间使用:
尝试这个
SELECT *
FROM orders
WHERE to_date(order_date, 'dd/mm/yyyy') between to_date ('01/12/2012', 'dd/mm/yyyy')
AND to_date ('31/12/2012', 'dd/mm/yyyy');
以防万一您使用 MS SQL:
SELECT *
FROM orders
WHERE CONVERT(DATETIME,order_date,101) between CONVERT(DATETIME,'01/12/2012',101)
AND CONVERT(DATETIME,'31/12/2012',101);
只需编写以下查询
select *
from table
where str_to_date('01/01/2013','%m%d%Y') between '2012-01-02' and '2013-01-02'
基本上,如果我没记错的话,您正在尝试在不更改数据格式的情况下寻找解决方案。如果没有明确提及,Between 操作员无法理解数据是日期。所以你不得不说这个字段是日期。每个数据库中都有类似的函数,例如 date()、to_date()。由于我不知道您使用的是哪个数据库,因此我无法为您提供如何解决它的确切语法。但我相信你可以很容易地找到它。如果需要更多详细信息,请告诉我。