如何将PG::Interval优雅转换为Crystal-Lang的Time::Span?
将PostgreSQL的PG::Interval转换为Crystal的Time::Span(非正则方式)
你可以直接利用Crystal pg 库内置的转换能力,无需手动写正则解析:
方案1:查询时直接指定目标类型
pg 库支持在 query_all 中直接声明返回 Time::Span 类型,会自动完成 PG::Interval 到 Time::Span 的转换:
TimeChecker = NamedTuple( id: UUID, time_to_something: Time::Span, # 直接定义为目标类型 ) # 查询时指定返回类型为{UUID, Time::Span},库会自动转换 results = conn.query_all("select id,time_to_something from my_table", as: {UUID, Time::Span}) results.each do |id, time_to_something| time_checker = TimeChecker.new( id: id, time_to_something: time_to_something # 无需额外处理 ) end
方案2:手动转换单个PG::Interval实例
如果需要单独处理某个 PG::Interval 对象,直接调用内置的 #to_time_span 方法即可:
interval = PG::Interval.new("1 second") span = interval.to_time_span # 得到等价于1.second的Time::Span实例
说明
pg 库内部已经实现了可靠的转换逻辑,会解析 PG::Interval 的年、月、日、时、分、秒等所有时间分量,映射到 Time::Span 的对应属性,比手动写正则更稳定且符合Crystal的语言习惯。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

