2012-04-18 59 views
0

我怎样才能用BETWEEN运算符选择存储为varchar的日期(格式:“2012.04”)?查询varchar日期与之间

我需要在此字段上选择一年的时间间隔。

现在我这个尝试,但是这给我的MySQL语法错误:

SELECT DISTINCT monthcol 
FROM bo_alerts 
WHERE STR_TO_DATE(monthcol , '%Y.%m') BETWEEN 
      (STR_TO_DATE('2012.04', '%Y.%m') AND STR_TO_DATE('2011.03', '%Y.%m')) 
ORDER BY monthcol DESC 

的日期现在静态的(用于测试),但我需要在之间,从而计算第二值它将在BETWEEN部分的第一个值精确到-1年。

非常感谢!

+0

好吧,我发现了语法错误的解决方案:不需要值之间的括号。但它仍然不会给我任何值... – VORiAND 2012-04-18 09:04:40

+1

切换参数日期。需求之间的第一个表达式小于第二个表达式。而且,如果您将日期存储为变量,则不必将它们转换回日期。比较仍然有效:'monthcol在'2011.03'和'2012.04'之间)' – 2012-04-18 09:07:51

回答

1

鉴于日期似乎是固定长度字符串,为什么不使用字符串比较?:

SELECT DISTINCT monthcol 
FROM bo_alerts 
WHERE monthcol BETWEEN '2011.03' AND '2012.04' 
ORDER BY monthcol DESC 

注意,我颠倒的日期的为了满足具有比第二第一最少SQL实现。

+0

EPiC失败了......还有一个facepalm ...只需要反转参数,非常感谢!你是否也有一年的计算解决方案?第一个值来自外部,为此我需要计算-1年。我认为:varchar-> date-> date-1year-> varchar – VORiAND 2012-04-18 09:13:59

+1

任何使用本地数据库日期或时间类型以外的东西来编码日期的模式都需要额外的麻烦来做算术。也许改变表结构,以便可以直接使用日期算术基元。这也提高了可维护性。 – wallyk 2012-04-18 09:16:37

0

Renove '.'从它的工作日期开始。

试试下面的查询:

SELECT DISTINCT monthcol 
FROM bo_alerts 
WHERE concat(LEFT(monthcol,4),RIGHT(monthcol,2)) BETWEEN 201204 AND 201103 
ORDER BY monthcol DESC