从日期SQL减去一小时

时间:2015-03-11 12:27:00

标签: java sql postgresql

我有一个date属性表示为String的实体(我无法将其更改为日期或时间戳)。我需要获取所有最新记录(不超过一小时) 。 我有一个SQL查询返回最后(最年轻)的记录,现在我需要以某种方式从它减去一小时:

SELECT p FROM Invoice p WHERE date >= ((SELECT MAX(date) FROM Invoice)

它是Java和Posgresql。当date表示为String?

时,可以使用SQL完成此操作

4 个答案:

答案 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上设置一个索引,以便加快速度。

您仍应将其存储为日期,而不是字符串。即使你说你做不到。

不要使用基本类型名称作为列名。