我有一个date
属性表示为String
的实体(我无法将其更改为日期或时间戳)。我需要获取所有最新记录(不超过一小时) 。
我有一个SQL查询返回最后(最年轻)的记录,现在我需要以某种方式从它减去一小时:
SELECT p FROM Invoice p WHERE date >= ((SELECT MAX(date) FROM Invoice)
它是Java和Posgresql。当date表示为String?
时,可以使用SQL完成此操作答案 0 :(得分:2)
SELECT p, to_timestamp(p.data, 'YYYYMMDD HH12MI') - interval '1 hour' new_dt
FROM Invoice p WHERE date >= ((SELECT MAX(date) FROM Invoice)
http://www.postgresql.org/docs/current/static/functions-datetime.html
http://www.postgresql.org/docs/current/static/functions-formatting.html
您必须修改to_timestamp的日期格式模式。我不知道你的数据库有什么格式。
答案 1 :(得分:0)
在java中它可以通过解析。但是在sql中是不可能的,因为你得到日期的数据类型是String。
答案 2 :(得分:0)
假设日期是列名,
select * from Invoice where "date"::date > now()-'1 hour'::interval
答案 3 :(得分:0)
使用to_date()
将字符串转换为实际的date
在此期间:您的查询以获得最新的行也可以改进:
SELECT *
, to_date(date, 'YYYY-MM-DD') - interval '1 hour' AS ts
FROM Invoice p
ORDER BY date DESC NULLS LAST
LIMIT 1;
假设ISO格式。无论哪种方式,您的文本表示必须工作以获得排序顺序,或者您需要执行更多操作。
从interval
中减去date
会自动生成timestamp
。
不要选择p
,这是表别名,并且会将整行作为单列而不是单个列。
ORDER BY
/ LIMIT 1
为此目的更快,更可靠。您的构造可以返回多行。
您应该在date
上设置一个索引,以便加快速度。
您仍应将其存储为日期,而不是字符串。即使你说你做不到。
不要使用基本类型名称作为列名。