我有一张简单的postgress表。
CREATE TABLE "SCHEMA".testdate
(
data timestamp without time zone NOT NULL
)
我的内容包含以下数据:
'2018-01-01 14:13:48.991'
'2018-01-01 14:13:49.835'
'2018-01-01 14:13:51.135'
'2018-01-01 14:14:48.068'
'2018-01-01 14:14:49.08'
'2018-01-01 14:14:50.03'
'2018-01-01 14:14:50.952'
'2018-01-01 14:14:51.794'
'2018-01-01 14:14:52.671'
'2018-01-01 14:14:53.552'
'2018-01-01 14:14:54.997'
我尝试使用此查询来查找特定时间间隔内的日期数:
SELECT COUNT(1) NUMBER FROM "SCHEMA".TESTDATE WHERE DATA BETWEEN to_date('01-01-2018 14:13:43','dd-mm-yyyy hh24:mi:ss')
and to_date('01-01-2018 15:13:45','dd-mm-yyyy hh24:mi:ss');
为什么这会返回0条记录? 我也尝试从java使用PreparedStatement setTimestamp方法代替示例中的两个日期和同样的问题。
Date now=new Date();
Date oneHourEarly=UTILS.addHours(now,-1);
ps.setTimestamp(1, new Timestamp(((java.util.Date) now).getTime()));
ps.setTimestamp(2, new Timestamp(((java.util.Date) oneHourEarly).getTime()));
我做错了什么?我正在使用PostgresSQL版本9.6。
答案 0 :(得分:3)
to_date()
返回date
(没有时间)而不是timestamp
。因此,两个函数都返回相同的日期:2018-01-01
您需要使用to_timestamp()
:
select count(*) as number
FROM testdate
WHERE DATA BETWEEN to_timestamp('01-01-2018 14:13:43','dd-mm-yyyy hh24:mi:ss') and to_timestamp('01-01-2018 15:13:45','dd-mm-yyyy hh24:mi:ss');
我更喜欢to_timestamp
(或to_date
)函数的标准SQL ISO时间戳文字
select count(*) as number
FROM testdate
WHERE DATA BETWEEN timestamp '2018-01-01 14:13:43' and timestamp '2018-01-01 15:13:45';