【问题标题】:pad() select to show 2 characterspad() 选择显示 2 个字符
【发布时间】:2019-01-10 02:11:02
【问题描述】:

我有一个有效的select 语句MySQL,它从以秒为单位的持续时间返回dayshoursminssecs -

SELECT Name, Zone, Duration,
FLOOR(Duration/60/60/24) as days,
FLOOR(Duration/60/60)%24 as hours,
FLOOR(Duration/60)%60 as mins,
Duration%60 as secs
from duration 

我希望每列有 2 个字符,所以所有数据都是 inline,所以不知何故需要用零填充任何单个字符 (即如果天数为 1,则填充 / 格式,因此天数为 01)

我已经尝试过 pad() -

PAD(FLOOR(Duration/60/60/24),2,0) as days

但这会导致 NULL。

任何想法表示赞赏。

问候 拉尔夫

【问题讨论】:

  • 您为什么要尝试在 SQL 查询中完成表示层的工作?别。从数据库中获取持续时间,并在表示层中对其进行格式化。
  • 谢谢,虽然我试图避免必须先执行 c:set 然后 fmt: 最后是 c:out,除非有更简单的方法?
  • 这并不容易。这是关于正确的。持久层应该返回您可以轻松使用的结构化数据,而不是预先格式化的文本。表示层负责以最佳方式为您的用户显示数据。如果您决定以人类形式显示持续时间(例如“几秒钟”或“3 小时”),该怎么办。显然数据库无法做到这一点。如果您更改格式或 i18n 要求,则不必更改持久层。
  • 更不用说,如果您创建一些标签或函数来正确格式化持续时间,您可以在任何地方使用它(数据库、Java 代码等),而您没有更改每个返回持续时间的 SQL 查询。

标签: mysql jsp datetime jdbc time


【解决方案1】:

这是SEC_TO_TIME()SUBSTR() 的工作。 要获取01:02:03,请使用SEC_TO_TIME(3723)

要获取 HH、MM、SS 的零填充数字,请执行以下操作:

SELECT SUBSTR(SEC_TO_TIME(3723),1,2) HH, 
       SUBSTR(SEC_TO_TIME(3723),4,2) MM, 
       SUBSTR(SEC_TO_TIME(3723),7,2) SS

如果你有一个整数,比如7,并且你想要文本字符串07,你可以使用LPAD()

 SELECT LPAD(7,2,'0')

专业提示:在表中使用 TIMEDATETIMESTAMP 和/或 DATETIME 数据类型是非常好的做法,因为它允许您将所有MySQL 提供的日期算法。 JDBC 提供了从这些数据库端数据类型到 Java 数据类型的干净转换,使得它们的操作几乎从数据库到程序无缝。

专业提示:在一个月左右的时间里,每周通读这两个 MySQL 参考手册页。了解可供您使用的功能会让您的工作更轻松。

【讨论】:

  • 感谢 O Jones,尽管请参阅我的另一篇关于尝试然后 CONCAT 或 CONCAT_WS 的帖子,它总是产生 NULL 和 SEC_TO_TIME,限制为 838 小时。
猜你喜欢
  • 2015-11-21
  • 2013-07-09
  • 2016-01-03
  • 2012-08-17
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多