将varchar与月份转换为日期

时间:2011-06-10 04:24:58

标签: mysql

mysql> select * from tr;
+------+
| mnt  |
+------+
| jun  |
| mar  |
| jan  |
| aug  |
+------+
4 rows in set (0.00 sec)

mysql> select * from tr1;
+------+------+
| mnt  | id   |
+------+------+
| aug  |   11 |
| jan  |   12 |
| mar  |   15 |
| apr  |   16 |
+------+------+
4 rows in set (0.00 sec)

it worked for this query..

mysql> select * from tr join tr1 on tr.mnt=tr1.mnt;
+------+------+------+
| mnt  | mnt  | id   |
+------+------+------+
| aug  | aug  |   11 |
| jan  | jan  |   12 |
| mar  | mar  |   15 |
+------+------+------+
3 rows in set (0.00 sec)

mysql> select * from tr2;
+------------+------+
| mn         | id   |
+------------+------+
| 2009-02-14 |   11 |
| 2009-03-03 |   12 |
| 2009-08-08 |   12 |
+------------+------+
3 rows in set (0.00 sec)

mysql> insert into tr2 values('2009-01-01',14);
Query OK, 1 row affected (0.06 sec)

但它不适用于此..

mysql> select * from tr join tr2 on tr.mnt=MONTHNAME(tr2.mn);
Empty set (0.00 sec)

请提供确切的查询..

2 个答案:

答案 0 :(得分:1)

MONTHNAME(date)返回一个varchar,所以“是” - 你可以比较它们。

请考虑以下语法:

select *
from A
join B on B.InvoiceMonth = MONTHNAME(A.Mnth);

答案 1 :(得分:0)

由于MONTHNAME()返回一个字符串而InvoiceMonth是一个字符串,因此您可以明智地比较它们。因此,在宽范围内,您的查询是可以的。不过,您应该使用现代的JOIN表示法:

SELECT *
  FROM A
  JOIN B ON B.InvoiceMonth = MONTHNAME(A.Mnth)
  JOIN C ON B.InvoiceMonth = MONTHNAME(C.Monthx)

您不需要使用所有三个条件:如果X = Y且Y = Z,则X = Z。

当然,由于2011年1月的结果与2010年1月的结果不太可比,因此您确实需要找出年度信息的来源,并确保您不要混淆年。