我在Grails域类中有一个LocalTime字段(使用Joda Time)。
Class WorkDone{
LocalTime duration
}
现在我已将此字段更改为String(具有Text约束),以便它可以支持大于24小时的持续时间。
String duration
问题是数据库中已经存在一些数据。我想通过Grails中的数据库迁移来清理这些数据。我正在使用Postgres将LocalTime保存为 Bytea (二进制数据)。
当我调用WorkDone.duration时,它返回一个表格形式的字符串:
\ xaced0005737200176f72672e6a6f64612e74696d652e4c6f63616c54696d65fffff44abbf29def0200024a000c694c6f63616c4d696c6c69734c000b694368726f6e6f6c6f677974001a4c6f72672f6a6f64612f74696d652f4368726f6e6f6c6f67793b78700000000000000000737200276f72672e6a6f64612e74696d652e6368726f6e6f2e49534f4368726f6e6f6c6f67792453747562a9c811667137502703000078707372001f6f72672e6a6f64612e74696d652e4461746554696d655a6f6e652453747562a62f019a7c321ae30300007870770500035554437878
如何从此字符串中提取时间?
答案 0 :(得分:4)
您的数据以bytea Hex格式显示,(以\ x开头)查看PostgreSQL文档
http://www.postgresql.org/docs/current/static/datatype-binary.html
你必须在读取之前将其取消为ObjectInputStream,然后获取LocalTime对象,对其进行unescape,然后再按照Raphael的建议再试一次。
答案 1 :(得分:1)
在将Data-type更改为String之前,您应该已完成数据迁移。
这是你应该做的。 1.将字段的数据类型更改回LocalTime。 2.使用字符串日期创建一个新字段。 3.编写一个脚本,该脚本将在LocalTime中获取所有日期并将其转换为String并将其保存在新字段中。 4.迁移数据后,删除旧字段,然后将新字段重命名为duration。
答案 2 :(得分:1)
我最终做了以下事情 -
grailsChange{
change{
sql.eachRow("Select id,duration from work_done"){
def wdId = it.id
def durationObj = (LocalTime)(new ObjectInputStream(new ByteArrayInputStream(it.duration))).readObject()
durationObj = durationObj.toString().substring(0,8)
WorkDone.executeUpdate("update WorkDone wd set wd.duration=:newDuration" +
"where wd.id=:wdId",
[newDuration:durationObj ,wdId:wdId ])
}
}