我在sqlite中以%H:%M字符串格式存储一些时间值(例如“15:43”),但是我希望以12小时格式将它们格式化为AM / PM指示符(例如“下午3:43“)。这是可能的sqlite(如果是这样,如何),或者我需要在我的应用程序代码中执行此操作?
答案 0 :(得分:4)
一些伪代码可以帮助您:
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语法,但您应该能够纠正错误。
答案 1 :(得分:4)
除非您使用自己的custom function扩展sqlite,否则您必须执行此操作。
sqlite的strftime日期格式化功能仅支持其C对应部分的一小部分,不足以解决您的问题。 sqlite也缺少像IF或CASE这样的选择结构,如果/不可能那么简单。
答案 2 :(得分:2)
这里有一些特殊情况。我使用'now'作为源代码,但您可以根据字符串调整它:
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;
答案 3 :(得分:1)
在您的申请中执行此操作。将其以正常的24小时格式存储在数据库中。在数据库中,它可以存储为Date条目而不是字符串(如果我错了,请纠正我)
答案 4 :(得分:0)
正如PoweRoy所建议的那样,这属于应用程序。
建议在通信中使用的任何类型的数据都使用标准的,区域设置不敏感的格式:http://www.mihai-nita.net/article.php?artID=20051025a
答案 5 :(得分:0)
这是一个工作的人...... 感谢Tomas
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;
<强>输出强>
Abdul Salim,12:05 PM