在hql中转换字符串列到目前为止

时间:2015-01-23 09:44:22

标签: java string hibernate casting hql

我需要获得超过2015年1月1日的所有日期记录。此查询不起作用,因为nt.valeur是dataType varchar(255)。我无法更改实体NotifTypeActionChampAddValVO的结构。 数据库服务器位于db2版本9.7上。

这是hql:

select nt.valeur from NotifTypeActionChampAddValVO  nt where nt.valide = 1  and nt.typeActionChampAdditionnelValue.champAdditionnel.id = 123  and cast(nt.valeur as date) = '01/01/2015')

我尝试通过强制转换(nt.valeur作为日期),但它会生成异常。

这是例外

DIAVERUM 2015-01-23 13:23:21,859 [http-8081-7] ERROR org.hibernate.util.JDBCExceptionReporter  - DB2 SQL Error: SQLCODE=-461, SQLSTATE=42846, SQLERRMC=SYSIBM.LONG VARCHAR;SYSIBM.DATE, DRIVER=3.63.75
DIAVERUM 2015-01-23 13:23:21,859 [http-8081-7] ERROR org.hibernate.util.JDBCExceptionReporter  - DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-461;42846;SYSIBM.LONG VARCHAR|SYSIBM.DATE, DRIVER=3.63.75

如何投射色谱柱 这个字符串列可以作为hql中的日期进行比较的方式是什么?

3 个答案:

答案 0 :(得分:5)

您可以使用db2 to_date函数将不同的字符串格式转换为日期。 例如

date(to_date(column,'DD-MM-YYYY HH:MI:SS'))

因此您可以查询(取决于列nt.valeur上使用的格式)

select nt.valeur from NotifTypeActionChampAddValVO  nt where nt.valide = 1  and nt.typeActionChampAdditionnelValue.champAdditionnel.id = 123  and date(to_date(nt.valeur,'DD-MM-YYYY HH:MI:SS')) = '01/01/2015')

请参阅:TO_DATE scalar function

to_date实际上是TIMESTAMP_FORMAT函数的别名,其中格式字符串的格式记录得更好。

答案 1 :(得分:2)

您可以在不尝试将字符串转换为日期的情况下执行此操作。试试这个

select nt.valeur from NotifTypeActionChampAddValVO  nt where nt.valide = 1  and nt.typeActionChampAdditionnelValue.champAdditionnel.id = 123  and concat(substring(nt.valeur, 7, 4), substring(nt.valeur, 4, 2), substring(nt.valeur, 1, 2)) > '20150101'

假设您的示例中的01/01/2015dd/MM/yyyy(但可以轻松更改),并且您可以将参数格式调整为yyyyMMdd

答案 2 :(得分:1)

试试这个: -

from NotifTypeActionChampAddValVO  nt where nt.valide = 1  and nt.typeActionChampAdditionnelValue.champAdditionnel.id = 123  and nt.valeur ='2015-01-01'