Как я могу отобразить дату в таких словах, как «Семнадцатое февраля 2016 года», используя mysql

#mysql #date-formatting #mysql-date

Вопрос:

У меня есть дата 2016-02-17 , я использовал DATE_FORMAT('2016-02-17', '%M, %D %Y') и отображаю ее вот так 'february, 17th 2016' , но я хочу отобразить february, seventeenth 2016 , то есть 17th в word, пожалуйста, помогите мне

Комментарии:

1. @1000111, ваш комментарий не имеет смысла.

2. Извини за это. Увидев это требование в первый раз, я немного расстроился ( :() и не смог удержаться от подобного комментария. @Рахул

3. @1000111, как я вижу, в этом вопросе нет ничего плохого. Вам лучше подумать об удалении своего комментария, так как это не очень помогает.

Ответ №1:

Вы можете попробовать что-то в этом роде:

 SELECT
    CONCAT(
        MONTHNAME(NOW()),
        ',',
        SUBSTRING_INDEX(
            SUBSTRING_INDEX('First Second Third Fourth Fifth Sixth Seventh Eighth Ninth Tenth 11th 12th 13th 14th 15th 16th 17th 18th 19th 20th 21st 22nd 23rd 24th 25th 26th 27th 28th 29th 30th 31st', ' ' ,DAY(NOW())),
            ' ',
            - 1
        ),
        ' ',
        YEAR (NOW())
    );
 

Примечание: Замените NOW() поле даты, а также обновите текст, как вы хотите, внутри SUBSTRING_INDEX('First Second.... .

Демонстрация:

 SET @sampleDate  := '2016-02-17';

SELECT
    CONCAT(
        MONTHNAME(@sampleDate),
        ', ',
        SUBSTRING_INDEX(
            SUBSTRING_INDEX('First Second Third Fourth Fifth Sixth Seventh Eighth Ninth Tenth 11th 12th 13th 14th 15th 16th 17th 18th 19th 20th 21st 22nd 23rd 24th 25th 26th 27th 28th 29th 30th 31st', ' ' ,DAY(@sampleDate)),
            ' ',
            - 1
        ),
        ' ',
        YEAR (@sampleDate)
    );
 

See Demo

Комментарии:

1. Почему str_to_date !?!

2. Но это не дает точного вывода, это показывает числовое значение не словами

3. Авинаш, может быть, пришло время для небольшого перерыва на кофе

4. Посмотри туда ( sqlfiddle.com/#!9/9eecb7d/75538/0 ). Вам нужно изменить текст, например 11th 12th 13th... , по ожидаемым значениям. @bhanuavinash

5. Я добавлю объяснение позже. Занят прямо сейчас 🙁 . Только на данный момент: The substring returned from right of the final delimiter when the specified number is a negative number. @DhavalSimaria

Ответ №2:

Функция записи и отображение ответа

 function convert_number_to_words($number) {

$hyphen      = '-';
$conjunction = '  ';
$separator   = ' ';
$negative    = 'negative ';
$decimal     = ' point ';
$dictionary  = array(
    0                   => 'Zero',
    1                   => 'One',
    2                   => 'Two',
    3                   => 'Three',
    4                   => 'Four',
    5                   => 'Five',
    6                   => 'Six',
    7                   => 'Seven',
    8                   => 'Eight',
    9                   => 'Nine',
    10                  => 'Ten',
    11                  => 'Eleven',
    12                  => 'Twelve',
    13                  => 'Thirteen',
    14                  => 'Fourteen',
    15                  => 'Fifteen',
    16                  => 'Sixteen',
    17                  => 'Seventeen',
    18                  => 'Eighteen',
    19                  => 'Nineteen',
    20                  => 'Twenty',
    30                  => 'Thirty',
    40                  => 'Fourty',
    50                  => 'Fifty',
    60                  => 'Sixty',
    70                  => 'Seventy',
    80                  => 'Eighty',
    90                  => 'Ninety',
    100                 => 'Hundred',
    1000                => 'Thousand',
    1000000             => 'Million',
    1000000000          => 'Billion',
    1000000000000       => 'Trillion',
    1000000000000000    => 'Quadrillion',
    1000000000000000000 => 'Quintillion'
);

if (!is_numeric($number)) {
    return false;
}

if (($number >= 0 amp;amp; (int) $number < 0) || (int) $number < 0 - PHP_INT_MAX) {
    // overflow
    trigger_error(
        'convert_number_to_words only accepts numbers between -' . PHP_INT_MAX . ' and ' . PHP_INT_MAX,
        E_USER_WARNING
    );
    return false;
}

if ($number < 0) {
    return $negative . convert_number_to_words(abs($number));
}

$string = $fraction = null;

if (strpos($number, '.') !== false) {
    list($number, $fraction) = explode('.', $number);
}

switch (true) {
    case $number < 21:
        $string = $dictionary[$number];
        break;
    case $number < 100:
        $tens   = ((int) ($number / 10)) * 10;
        $units  = $number % 10;
        $string = $dictionary[$tens];
        if ($units) {
            $string .= $hyphen . $dictionary[$units];
        }
        break;
    case $number < 1000:
        $hundreds  = $number / 100;
        $remainder = $number % 100;
        $string = $dictionary[$hundreds] . ' ' . $dictionary[100];
        if ($remainder) {
            $string .= $conjunction . convert_number_to_words($remainder);
        }
        break;
    default:
        $baseUnit = pow(1000, floor(log($number, 1000)));
        $numBaseUnits = (int) ($number / $baseUnit);
        $remainder = $number % $baseUnit;
        $string = convert_number_to_words($numBaseUnits) . ' ' . $dictionary[$baseUnit];
        if ($remainder) {
            $string .= $remainder < 100 ? $conjunction : $separator;
            $string .= convert_number_to_words($remainder);
        }
        break;
}

if (null !== $fraction amp;amp; is_numeric($fraction)) {
    $string .= $decimal;
    $words = array();
    foreach (str_split((string) $fraction) as $number) {
        $words[] = $dictionary[$number];
    }
    $string .= implode(' ', $words);
}

return $string;
}

 echo convert_number_to_words(17);
 

Ответ №3:

Объяснение приведенного выше кода, что опубликовал 1000111:

      inner substring:
                 SELECT SUBSTRING_INDEX('First Second Third Fourth Fifth Sixth Seventh Eighth Ninth Tenth 11th 12th 13th 14th 15th 16th Seventeenth 18th 19th 20th 21st 22nd 23rd Twentyfourth 25th 26th 27th 28th 29th 30th 31st', ' ' ,DAY('2016-02-17'))

         output:
                    First Second Third Fourth Fifth Sixth Seventh Eighth Ninth Tenth 11th 12th 13th 14th 15th 16th Seventeenth 18th 19th 20th 21st 22nd 23rd Twentyfourth 

        outer substring:

                SELECT SUBSTRING_INDEX(
                        SUBSTRING_INDEX('First Second Third Fourth Fifth Sixth Seventh Eighth Ninth Tenth 11th 12th 13th 14th 15th 16th Seventeenth 18th 19th 20th 21st 22nd 23rd Twentyfourth 25th 26th 27th 28th 29th 30th 31st', ' ' ,DAY('2016-02-17')),
                        ' ',
                        - 1
                    )

         output:

                "Seventeenth " if count is -1 
                "first" if count is 1
                "18th Seventeenth " if count is -2
                "first second" if count is 2

 input:

    SELECT
    CONCAT(
        MONTHNAME('2016-02-17'),
        ',',
        SUBSTRING_INDEX(
            SUBSTRING_INDEX('First Second Third Fourth Fifth Sixth Seventh Eighth Ninth Tenth 11th 12th 13th 14th 15th 16th Seventeenth 18th 19th 20th 21st 22nd 23rd TwentyFourth 25th 26th 27th 28th 29th 30th 31st', ' ' ,DAY('2016-02-17')),
            ' ',
            - 1
        ),
        ' ',
        YEAR ('2016-02-17')
    );

 output:
    Feb, Seventeenth 2016