sqlite 你能用AM/PM将24小时的时间串格式化为12小时的时间串吗?

8xiog9wr  于 11个月前  发布在  SQLite
关注(0)|答案(7)|浏览(182)

我在sqlite中以%H:%M字符串格式存储了一些时间值(例如“15:43”),但我想将它们格式化为12小时格式,并带有AM/PM指示符(例如“3:43 PM”)。使用sqlite是否可以这样做(如果可以,如何做到),或者我需要在应用程序代码中这样做吗?

goqiplq2

goqiplq21#

这是一个工作的...谢谢托马斯

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

a0zr77ik

a0zr77ik2#

Abdul Salim的答案只返回PM,无论找到哪个值,因为在最后一个CASE WHEN结束时有一个小错误。

SELECT
    username, 
    sqlaction,
    change_date, 
    CASE WHEN 
        StrFTime('%H', change_date) % 12 = 0 THEN 12
        ELSE StrFTime('%H', change_date) % 12 END 
    || ':' ||
        StrFTime('%M', change_date)
    || ' ' ||
    CASE WHEN
        StrFTime('%H', change_date)-0 >= 12 THEN 'PM'
        ELSE 'AM' END   
    as Time
From logs;

字符串
输出值:
| 用户名|SQLACTION|变更日期|时间|
| --|--|--|--|
| 特科托|更新|2023-09-15 11:37:21|上午11:37|
| 小跑|更新|2023-09-15 11:57:57|上午11时57|
| 特科托|插入|2023-09-18 11:24:59|上午11:24|
| 特科托|插入|2023-09-18 11:25:05|上午11时25|
| 特科托|更新|2023-09-18 16:34:51|下午4点34分|
| 托托|更新|2023-09-18 16:43:56| 4:43下午|
| 特科托|更新|2023-09-18 16:45:50|下午4点45|
| 特科托|更新|2023-09-18 17:17:22|下午5点17分|

igsr9ssn

igsr9ssn3#

除非你用你自己的custom function扩展sqlite,否则你必须用代码来做这件事。
sqlite的strftime日期格式化函数只支持其C对应函数的一小部分,不足以解决您的问题。sqlite还缺乏IF或CASE等选择结构,使得简单的if/else无法实现。

mec1mxoz

mec1mxoz4#

一些伪代码可以帮助你:

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语法,但您应该能够纠正错误。

aydmsdu9

aydmsdu95#

这里涉及到一些特殊情况。我使用'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;

字符串

velaa5lx

velaa5lx6#

在你的应用程序中这样做。在数据库中以正常的24小时格式存储它。在数据库中,它可以存储为日期条目而不是字符串(如果我错了,请纠正我)

tkclm6bt

tkclm6bt7#

正如PoweRoy建议的那样,这属于应用程序。
建议在通信中存储或使用的任何类型的数据都使用标准的、不区分区域设置的格式:http://www.mihai-nita.net/article.php?artID=20051025a

相关问题