我有一个表格,其中包含contian birth date(bdate)和更晚的日期(条目)。 当一个人的年龄低于35岁时,我希望值为2 当年龄> = 36且<= 40时,我想要值3,依此类推。
但是,我的查询永远不会返回高于3的值。有什么问题?
SELECT TIMESTAMPDIFF( YEAR, str_to_date( CONCAT( 19, bdate ) , '%Y %m %d' ) , entry),
CASE
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 35 THEN 2
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) >= 36 <= 40 THEN 3
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) >= 41 <= 45 THEN 4
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) >= 46 <= 50 THEN 5
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) >= 51 <= 55 THEN 6
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) >= 56 <= 60 THEN 7
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) >= 61 <= 65 THEN 8
ELSE 0
END AS value
FROM mytable
答案 0 :(得分:2)
你需要分离不平等。这是一个例子:
SELECT @a := TIMESTAMPDIFF( YEAR, str_to_date( CONCAT( 19, bdate ) , '%Y %m %d' ) , entry),
CASE
WHEN @a <= 35 THEN 2
WHEN @a >= 36 and @a <= 40 THEN 3
WHEN @a >= 41 and @a <= 45 THEN 4
WHEN @a >= 46 and @a <= 50 THEN 5
WHEN @a >= 51 and @a <= 55 THEN 6
WHEN @a >= 56 and @a <= 60 THEN 7
WHEN @a >= 61 and @a <= 65 THEN 8
ELSE 0
END AS value
FROM mytable
使用临时变量(@a
)的那个小技巧可以为你节省大量的打字工作(并使事情更加清晰)。
希望这有帮助
答案 1 :(得分:1)
删除大于部分:
SELECT TIMESTAMPDIFF( YEAR, str_to_date( CONCAT( 19, bdate ) , '%Y %m %d' ) , entry),
CASE
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 35 THEN
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 40 THEN
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 45 THEN
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 50 THEN
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 55 THEN
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 60 THEN
WHEN TIMESTAMPDIFF(YEAR, str_to_date(CONCAT(19, bdate), '%Y %m %d'), entry) <= 65 THEN
ELSE 0
END AS value
FROM mytable
正在查看>= 36
并将其评估为true。你不能简单地在>= 36 <= 40
中连接。
答案 2 :(得分:0)
存在语法错误。
与两个值进行比较是错误的。
WHEN TIMESTAMPDIFF( YEAR, str_to_date( CONCAT( 19, bdate ), '%Y %m %d' ), entry )
>= 36 <= 40 THEN 3
使用between
子句比较范围内的值。
WHEN TIMESTAMPDIFF( YEAR, str_to_date( CONCAT( 19, bdate ), '%Y %m %d' ), entry )
BETWEEN 36 AND 40 THEN 3
在其他此类比较中应用相同的内容。
答案 3 :(得分:0)
只是减去值
SELECT
CASE
WHEN bdate - entry <= 35 THEN 2
WHEN bdate - entry between 36 and 40 THEN 3
WHEN bdate - entry between 41 and 45 THEN 4
WHEN bdate - entry between 46 and 50 THEN 5
WHEN bdate - entry between 51 and 55 THEN 6
WHEN bdate - entry between 56 and 60 THEN 7
WHEN bdate - entry between 61 and 65 THEN 8
ELSE 0
END AS value
FROM mytable