不使用sql中的BEVERY语句访问值

不使用sql中的BEVERY语句访问值,sql,date,varchar,between,Sql,Date,Varchar,Between,我将日期存储为数据库中的varchar。当我试图使用sql中的between操作符访问某些数据以获取某些日期之间的值时,它没有给出正确的输出,因为我将日期存储为varchar。日期的格式为(2013年12月1日)(dd/mm/yyyy) 有没有想过在不将日期从varchar更改为date格式的情况下使用between语句访问正确的数据 谢谢。您将日期存储为varchar,然后使用to_date函数转换为日期格式,然后在操作员之间使用: 试试这个 SELECT * FROM orders WHER

我将日期存储为数据库中的varchar。当我试图使用sql中的
between
操作符访问某些数据以获取某些日期之间的值时,它没有给出正确的输出,因为我将日期存储为varchar。日期的格式为
(2013年12月1日)(dd/mm/yyyy)

有没有想过在不将日期从varchar更改为date格式的情况下使用between语句访问正确的数据


谢谢。

您将日期存储为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');

将日期存储为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);

以防万一,如果您使用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'

只需编写以下查询

select * 
from table 
where str_to_date('01/01/2013','%m%d%Y') between '2012-01-02' and '2013-01-02'

基本上,如果我没有错的话,您是在试图寻找不改变数据格式的解决方案。 若未明确提及,则操作员无法理解数据为日期。所以你必须说这个字段是日期。每个数据库中都有类似的函数,如date()、to_date()。由于我不知道您使用的是哪一个数据库,因此无法给出如何解析它的确切语法。
但我相信你会很容易找到的。如果需要更多细节,请告诉我

如果我没有错的话,基本上你是在不改变数据格式的情况下寻找解决方案。 若未明确提及,则操作员无法理解数据为日期。所以你必须说这个字段是日期。每个数据库中都有类似的函数,如date()、to_date()。由于我不知道您使用的是哪一个数据库,因此无法给出如何解析它的确切语法。
但我相信你会很容易找到的。如果需要更多细节,请告诉我

不要混淆数据类型-它与您的问题无关。如果删除日期中的/以获得真实数字,您会看到这一点:2013年2月20日实际上比2014年2月1日高出2100多万

2013年2月20日=20022013
2014年2月1日=2014年10月10日

如果varchar中的数字是按日期、月份、年份的顺序排列的,则必须在字段或查询中对其进行重新排序,以获得正确的值,但如果它们是在年-月-日中,则有一个varchar,其排序方式与datetime类似

解决方案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  
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   
查询:

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'
现在,数字的排序方式与datetime相同-您只需删除/和-即可查看数字。所以varchar的排序与date\u 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返回的日期—您猜对了—两条记录完全相同,如first query和其他一些记录,就像发生在您身上的事情一样:

数据:

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  
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年2月20日实际上比2014年2月1日高出2100多万

2013年2月20日=20022013
2014年2月1日=2014年10月10日

如果varchar中的数字是按日期、月份、年份的顺序排列的,则必须在字段或查询中对其进行重新排序,以获得正确的值,但如果它们是在年-月-日中,则有一个varchar,其排序方式与datetime类似

解决方案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  
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   
查询:

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'
现在,数字的排序方式与datetime相同-您只需删除/和-即可查看数字。所以varchar的排序与date\u 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返回的日期—您猜对了—两条记录完全相同,如first query和其他一些记录,就像发生在您身上的事情一样:

数据:

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  
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   

您至少可以在where子句中使用TOU date…您至少可以在where子句中使用TOU date…欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
{}
),以很好地格式化和语法突出显示它!欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
{}
),以精确地格式化和语法突出显示它!如果在表中找到,您的上一次查询还将返回例如“03/03/2013”和“03/02/2014”。如果在表中找到,您的上一次查询还将返回例如“03/03/2013”和“03/02/2014”。