Выводим название месяца вместо номера - PullRequest
2 голосов
/ 08 июля 2010

У меня есть запрос, который возвращает 3 поля, одним из которых является месяц в виде двузначного числа.

Я хочу, чтобы в основном это было так, если месяц == 1 выходной январь, если месяц == 02 выходной февраль и т. Д.

Это то, что я пытаюсь, но это совсем не работает и не позволяет отображать весь столбец в PHP.

            while ($row = mysql_fetch_array($sqlstr)) {
               if ($row['theMonth']=="6") {
                  echo "<td>{June}</td>";}
                  echo "<td>{$row['sumSales']}</td>";
                  echo "<td>{$row['sumPurchases']}</td>";
                  echo "</tr>";
               }
            }

Как правильно делать то, что я хочу, и почему я делаю неправильно?

SQL-запрос, который я использую:

SELECT theMonth, sum(Sales) as sumSales, sum(Purchases) as sumPurchases
FROM
 ( SELECT date_format(saledate, '%Y-%m') AS theMonth, sales.cost as Sales, 0 AS Purchases
   FROM sales, products
   WHERE sales.product=products.name AND category='Food' OR category='Bocas' 
                OR category='Bebidas' OR category='Flor de cana por botellas' 
                OR category='Vino por botella' OR category='hora feliz'
  UNION ALL
   SELECT date_format(purchasedate, '%Y-%m') AS theMonth, 0 as Sales, purchases.cost as Purchases
   FROM purchases
 ) AS all_costs
group by theMonth

Не думаю, что смогу просто заменить

SELECT date_format(purchasedate, '%Y-%m') AS theMonth

с

SELECT MONTHNAME(purchasedate) AS theMonth

Итак, как лучше всего вернуть название месяца в виде текста в SQL?

Ответы [ 5 ]

3 голосов
/ 08 июля 2010

В вашем SQL вы можете использовать DATE_FORMAT для преобразования даты в название месяца:

SELECT DATE_FORMAT(NOW(), '%M')
July

Список допустимых спецификаторов можно найти в документации по MySQL.

( MONTHNAME также должно работать.)

Причина, по которой ваш текущий метод не работает, заключается в том, что вы в настоящее время выводите и год, и месяц (например, «2010-06»), и эта строка не сравнивается со строкой «6». *

1 голос
/ 08 июля 2010

Первый вариант - изменить запрос SQL, чтобы он возвращал месяц как имя, а не (или как) число. См. MONTHNAME

Второй вариант - использовать функции даты PHP для генерации имени для вас

$monthName = date('F',mktime(1,1,1,$row['theMonth'],1,2010));

В-третьих, использовать массив имен месяцев, аналогично предложению Зебедии

1 голос
/ 08 июля 2010

.

function month_name($int) {
  return date( 'F' , mktime(1, 1, 1, (int)$int, 1) );
}
echo month_name(2); // February
0 голосов
/ 08 июля 2010

У вас есть заключительная фигурная скобка в конце строки вашего первого оператора echo. Это приводит к тому, что PHP преждевременно завершает условный блок, а затем у него возникает ошибка синтаксического анализа, когда он наталкивается на последнюю закрывающую фигурную скобку, поскольку у него нет начального совпадения.

Вы можете получить название месяца из отметки времени (если она есть) с помощью функции даты. date('F', $timestamp); см. Ссылку на функцию php date

Выполнение этого в операторе SQL, вероятно, является самым простым и удобным для производительности способом решения этой конкретной ситуации.

0 голосов
/ 08 июля 2010

Возможно, для этого есть встроенный php, но ничего подобного не используется

$monthNames = array(1 => "January", 2 => "Febuary", 3 => "March", .... 12 => "December");
while ($row = mysql_fetch_array($sqlstr)) {
    echo "<td>{$monthNames[$row['theMonth']]}</td>";
    echo "<td>{$row['sumSales']}</td>";
    echo "<td>{$row['sumPurchases']}</td>";
    echo "</tr>";

}
...