2010-01-06 11 views

Répondre

7

Je ne sais pas d'une fonction intégrée, mais il est assez facile d'écrire:

SELECT 
    CONCAT(my_number, CASE 
    WHEN my_number%100 BETWEEN 11 AND 13 THEN "th" 
    WHEN my_number%10 = 1 THEN "st" 
    WHEN my_number%10 = 2 THEN "nd" 
    WHEN my_number%10 = 3 THEN "rd" 
    ELSE "th" 
    END) 
FROM my_table; 
+0

J'apprécie cela pour le cas général, bien que je pense que 'my_number% 100 BETWEEN 11 AND 13' est plus clair dans l'intention du cas d'exception. À première vue, j'allais commenter que vous avez oublié 11, 12, 13. –

+0

Je l'aime - réponse éditée. – Ken

1

MySQL ne prend pas en charge pour cela. Vous devrez gérer les chaînes dans la langue d'origine des données mysql.

0

Il est possible dans MySQL d'utiliser les fonctions de chaîne, mais cela devient vraiment compliqué. Vous feriez mieux de faire le suffixe dans la langue que vous utilisez. Par exemple, en PHP, vous pouvez faire quelque chose comme ceci:

function ordSuffix($num) { 
    if(empty($num) || !is_numeric($num) || $num == 0) return $num; 
    $lastNum = substr($num, -1); 
    $suffix = 'th'; 
    if($lastNum == 1 && $num != 11) { $suffix = 'st'; } 
    elseif($lastNum == 2 && $num != 12) { $suffix = 'nd'; } 
    elseif($lastNum == 3 && $num != 13) { $suffix = 'rd'; } 
    return $num.$suffix; 
} 

echo ordSuffix(4); // 4th 
echo ordSuffix(1); // 1st 
echo ordSuffix(12); // 12th 
echo ordSuffix(1052); // 1052nd 
0

J'ai trouvé une manière qui fonctionne pour moi, mais il est un peu un hack

DATE_FORMAT(CONCAT('2010-01-', my_number), '%D') 

cela fonctionne parce que le nombre actuellement je regarde jamais passe au-dessus 25. mais il ne généralise pas bien que quelqu'un puisse être modifiée par celle-ci:

CONCAT(
    IF(my_number % 100 BETWEEN 11 AND 13, 
     FLOOR(my_number/100), 
     FLOOR(my_number/10)), 
    DATE_FORMAT(
     CONCAT('2010-01-', 
      IF(my_number % 100 BETWEEN 11 AND 13 
       my_number % 100, 
       my_number % 10)), 
     '%D')) 

Mais c'est beaucoup de travail pour avoir accès à la fonctionnalité DATE_FORMAT quand Ken's code est plus simple.

0

Basé sur le code de Ken, une fonction de MySQL personnalisé serait comme suit:

DELIMITER $$ 
CREATE FUNCTION ordinal(number BIGINT) 
RETURNS VARCHAR(64) 
DETERMINISTIC 
BEGIN 
    DECLARE ord VARCHAR(64); 
    SET ord = (SELECT CONCAT(number, CASE 
    WHEN number%100 BETWEEN 11 AND 13 THEN "th" 
    WHEN number%10 = 1 THEN "st" 
    WHEN number%10 = 2 THEN "nd" 
    WHEN number%10 = 3 THEN "rd" 
    ELSE "th" 
    END)); 
    RETURN ord; 
END$$ 
DELIMITER ; 

Ensuite, il peut être utilisé comme:

SELECT ordinal(1) -- 1st 
SELECT ordinal(11) -- 11th 
SELECT ordinal(21) -- 21st 

SELECT ordinal(my_number) FROM my_table