情况何时不返回预期值

时间:2014-02-28 07:07:48

标签: mysql

我有一个表格,其中包含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

4 个答案:

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