Вы можете отформатировать 24-часовую строку времени в 12-часовую строку с AM / PM? - PullRequest
5 голосов
/ 11 февраля 2009

Я храню некоторые значения времени в sqlite в формате строки% H:% M (например, «15:43»), но я хотел бы вывести их в 12-часовом формате с индикаторами AM / PM (например, 15:43 "). Возможно ли это с помощью sqlite (и если да, то как), или мне нужно сделать это в коде моего приложения?

Ответы [ 6 ]

4 голосов
/ 11 февраля 2009

Если вы не расширили sqlite своей собственной пользовательской функцией , вам придется сделать это с помощью кода.

sqlite strftime функция форматирования даты поддерживает только небольшое подмножество своего аналога C, что недостаточно для вашей проблемы. sqlite также не хватает конструкции выбора, такой как IF или CASE, что делает простой вариант if / else невозможным.

4 голосов
/ 11 февраля 2009

Псевдокод, который поможет вам в пути:

if (hourpart of time >= 12)
    subtract 12 from hours
    append string " pm"
else // hourpart < 12
    append string " am"
end if

В SQL вы можете сделать это, используя синтаксис CASE .


После более внимательного изучения проблемы:

SELECT (CASE HOUR(myTimeColumn) >= 12 WHEN 1 THEN
         ((HOUR(myTimeColumn) - 12) + '-' + MINUTE(myTimeColumn) + ' pm')
       ELSE
         (HOUR(myTimeColumn) + '-' + MINUTE(myTimeColumn) + ' am')
       AS AmPmTime,
       someOtherColumn
FROM myTable

Я не совсем уверен, что все это допустимый синтаксис SQLite, но вы должны быть в состоянии исправить ошибки.

2 голосов
/ 29 января 2011

Есть несколько особых ситуаций, которые описаны здесь. Я использую «сейчас» в качестве источника, но вы можете настроить его для вашей строки:

select
  CASE 
  --For 00:05, for example.
  WHEN (strftime('%H', 'now', 'localtime') - 12) = -12
  THEN  '12:' || strftime('%M', 'now', 'localtime') ||' '|| 'AM'
  --For 12:05, for example.
  WHEN (strftime('%H', 'now', 'localtime') - 12) = 0
  THEN '12:' || strftime('%M', 'now', 'localtime') ||' '|| 'PM'
  --other am time
  WHEN (strftime('%H', 'now', 'localtime') - 12) < 0
  THEN  strftime('%H', 'now', 'localtime') ||':'||
    strftime('%M', 'now', 'localtime') ||' '|| 'AM'
  ELSE
  --other pm time
    (cast(strftime('%H', 'now', 'localtime') as integer) - 12) ||':'||
    strftime('%M', 'now', 'localtime') ||' '|| 'PM'
  END here_you_go_usa;
1 голос
/ 11 февраля 2009

Сделайте это в вашем приложении. Сохраните его в обычном 24-часовом формате в базе данных. В базе данных она может храниться как запись даты вместо строки (поправьте меня, если я ошибаюсь)

0 голосов
/ 06 декабря 2014

Вот рабочий. Спасибо Томасу

SELECT 
    PatientName, 
    CASE WHEN 
        StrFTime('%H', AppointmentTime) % 12 = 0 THEN 12
        ELSE StrFTime('%H', AppointmentTime) % 12 END 
    || ':' ||
        StrFTime('%M', AppointmentTime)
    || ' ' ||
    CASE WHEN
        StrFTime('%H', AppointmentTime) > 12 THEN 'PM'
        ELSE 'AM' END   
    `APP_TIME`
From Patients;      

OUTPUT
Абдул Салим, 12:05

0 голосов
/ 11 февраля 2009

Как рекомендует PoweRoy, это относится к приложению.

Рекомендуется, чтобы любой тип данных, сохраняемых для использования в связи, использовал стандартный, нечувствительный к локали формат: http://www.mihai -nita.net / article.php? ArtID = 20051025a

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...