Преобразование номера месяца в название месяца с помощью sql

В моей базе данных столбец «номер месяца» (varchar) указывает месяц. (1 = январь, 12 = декабрь) Теперь мне нужно повторить название месяца вместо числа.

Я уже нашел несколько примеров, и мне кажется, что использование DateName( ) — правильный способ делать такие вещи. Но даже с этими примерами у меня не работает. Видимо я что-то упускаю, но не могу понять что...

Файл .htaccess:

RewriteRule ^example/([^/]+)/([^/]+)$ test?year=$1&monthnumber=$2 [L,QSA]

HTML/php:

<?php
    $year= $_GET['year'];
    $monthnumber= $_GET['monthnumber'];

    $sql = "SELECT DISTINCT DateName( month, DateAdd( month , 'monthnumber' , -1 ) ) AS 'monthname', monthnumber, year FROM `exampletable` WHERE year = :year AND monthnumber = :monthnumber";

    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(":year", $year);
    $stmt->bindParam(":monthnumber", $monthnumber);
    $stmt->execute();

    if($result = $stmt->fetch(PDO::FETCH_ASSOC))
    {
    ?>

    <?php echo strtolower($result['monthname']);?> <?php echo $result['year'];?>

    <?php
    }// end if
    else {
    echo '0 results';
    }// end else
    ?>

Некоторые примеры строк (год, номер месяца)

(2014 8), (2014 7), (2013 8), ...

Когда я пытаюсь открыть example.com/2014/8, он выдает "0 результатов" вместо "август 2014", в то время как мой старый код (месяц отображается как число) работает:

$sql = "SELECT DISTINCT monthnumber, year FROM `exampletable` WHERE year = :year AND monthnumber = :monthnumber";

person Stan    schedule 21.09.2014    source источник


Ответы (2)


Это ваш запрос:

SELECT DISTINCT DateName( month, DateAdd( month , 'monthnumber' , -1 ) ) AS monthname,
       monthnumber, year
FROM `exampletable`
WHERE year = :year AND monthnumber = :monthnumber

Он использует функции из SQL Server, поэтому я сомневаюсь, что это будет работать в MySQL.

Вам лучше просто использовать оператор case:

select distinct (case when monthnumber = '1' then 'January'
                      when . . .
                      when monthnumber = '12' then 'December'
                 end) as monthname
from exampletable
where year = :year and monthnumber = :monthnumber;

Вы также можете сделать это, создав дату и используя monthname():

select distinct monthname(date(concat_ws('-', year, monthnumber, '01'))) as monthname
from exampletable
where year = :year and monthnumber = :monthnumber;

Примечание: вы должны использовать только одинарные кавычки для дат и строковых констант. Никогда не используйте одинарные кавычки вокруг имен столбцов, это только приведет к проблемам.

person Gordon Linoff    schedule 21.09.2014
comment
Спасибо за ответ! Я использовал monthname(), и он отлично работает. Еще один вопрос: этот код поддерживает и другие языки? Допустим, я хотел бы отображать название месяца на французском или немецком языке? Или мне нужно использовать оператор case тогда? - person Stan; 21.09.2014
comment
@Стэн. . . Используйте оператор case. Он должен возвращать значение на языке базы данных, и у вас может не быть большого контроля над этим. - person Gordon Linoff; 21.09.2014

В MySql просто используйте следующий оператор для преобразования числа в месяц (рабочий пример)

SELECT MONTHNAME(STR_TO_DATE(id,'%m')) as nameofmonth FROM `user`
person vinod    schedule 21.09.2014