【问题标题】:Read 'Time without time zone' type as String(Character varying) type in PostgreSQL query在 PostgreSQL 查询中将“没有时区的时间”类型读取为字符串(字符变化)类型
【发布时间】:2021-12-12 14:50:29
【问题描述】:

我在 java 中有以下 HQL 查询

try (Session context = HibernateUtil.getLocalSessionFactory().openSession()) {
    List list = null;
    String queryText = "select rf.Name, to_char(rf.StartDateTime,'YYYY/MM/DD HH24:MI:SS'), rf.Duration from RecordFile as rf";
    var query = context.createQuery(queryText);
    list = query.list();
}
var query = context.createQuery(queryText.toString());

类型有:

rf.Name -> Character varying (20),
rf.StartDateTime -> Timestamp without time zone,
rf.Duration -> Time without time zone

我需要将三个字段中的每一个都读取为字符串。 名称是字符串。 StartDateTime 通过 to_char 方法转换为 String。但我无法将持续时间字段转换为字符串。持续时间在 DB 中显示为 00:05:08,即 00 小时 05 分 08 秒。

有人知道吗?

谢谢

更新

其实还有一个类

public MyClass
{
    MyClass(String name, String startDateTime, String Duration)
     {
       .
       .
       .
     }
}

查询输出调用这个类。这就是为什么我需要将 Date 转换为 String 并且不允许更改 DB。

主要的queryText是:

String queryText = "select new PackageName.MyClass(rf.Name, to_char(rf.StartDateTime,'YYYY/MM/DD HH24:MI:SS'), rf.Duration) from RecordFile as rf";

【问题讨论】:

  • 为什么要将数据作为字符串检索?更喜欢将timestamp without time zone 获取到LocalDateTimetime without time zoneLocalTime(后者有点可疑,在这种情况下我们更喜欢Duration,但Hibernate 可能不支持)。跨度>
  • 我已经更新了我的问题。谢谢
  • 天哪,从数据库中检索字符串并将日期和时间作为 Java 模型中的字符串处理。您组织中的某个人不喜欢让事情变得简单。 :-( 你还在字符串中存储数字和布尔值吗?;-)
  • @OleV.V.好吧,如果日期/时间处理和处理发生在数据库中而不是 Java 模型中,这可能是有意义的。也许后者只是处理演示。他们确实以(几乎)正确的原生类型存储日期/时间和持续时间。
  • 这是一个老项目,故事太复杂了。我们在 C# 端使用输出作为 Web 服务响应,而不是 java 模型 :(。例如 dateTime 作为字符串传输到 C# 并且 DateTime.Parse(string-datetime-value) 将转换为 DateTime 类型。

标签: java postgresql time timezone hql


【解决方案1】:

将您的查询文字更改为使用to_char

select rf.Name, to_char(rf.StartDateTime,'YYYY/MM/DD HH24:MI:SS'), 
       to_char(rf.Duration, 'HH24:MI:SS') as duration
from RecordFile as rf;

如果你想保留小数部分,那么就

select rf.Name, to_char(rf.StartDateTime,'YYYY/MM/DD HH24:MI:SS'), 
       rf.Duration::text
from RecordFile as rf;

不相关,但我认为time 在一段时间内不是正确的数据类型。也许使用interval

【讨论】:

  • 你的权利,但不幸的是我不允许修改数据库。我会检查你的解决方案。谢谢
  • 第一个建议对我有用,但不是第二个。谢谢?
  • "but not second one" - 可能是因为 HQL 将 ':' 解释为参数标记。接受答案吗?
  • 当然。你说得对。谢谢
猜你喜欢
  • 1970-01-01
  • 2019-11-08
  • 2013-06-04
  • 2020-09-06
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
相关资源
最近更新 更多