1

我将日期作为 varchar 存储在数据库中。当我尝试使用betweensql 中的运算符访问某些数据以获取某些日期之间的某些值时,它没有给出正确的输出,因为我将日期存储为 varchar。日期就是这种格式(01/12/2013)(dd/mm/yyyy)

在不将日期从 varchar 更改为日期格式的情况下使用 between 语句访问正确数据的任何想法?

谢谢你。

4

5 回答 5

1

不要对数据类型感到困惑——它与您的问题无关。如果您删除日期中的 /,您会看到这一点 - 获得实数: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   
于 2013-02-08T07:08:02.440 回答
0

您将日期存储为 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');
于 2013-02-08T05:04:07.810 回答
0

以防万一您使用 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);
于 2013-02-08T05:06:41.920 回答
0

只需编写以下查询

select * 
from table 
where str_to_date('01/01/2013','%m%d%Y') between '2012-01-02' and '2013-01-02'
于 2013-02-08T05:11:10.133 回答
0

基本上,如果我没记错的话,您正在尝试在不更改数据格式的情况下寻找解决方案。如果没有明确提及,Between 操作员无法理解数据是日期。所以你不得不说这个字段是日期。每个数据库中都有类似的函数,例如 date()、to_date()。由于我不知道您使用的是哪个数据库,因此我无法为您提供如何解决它的确切语法。但我相信你可以很容易地找到它。如果需要更多详细信息,请告诉我。

于 2013-02-08T05:14:41.567 回答