您的位置:首页 > 数据库 > Oracle

oracle、mysql、PostgreSQL有关时间查询和时间切割

2017-10-01 17:20 691 查看

oracle

--日期转换:
SELECT COUNT(*)
FROM MY_TABLE T
WHERE T.DATE_UPDATED >=
TO_DATE('2015-11-19 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
AND T.DATE_CREATED <=
TO_DATE('2015-11-19 23:59:59', 'yyyy-mm-dd hh24:mi:ss');

--long转换为时间格式:
SELECT TO_DATE('1970-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') +
1458542220000 / (24 * 60 * 60 * 1000) +
+TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE), 1, 3)) / 24
FROM DUAL;

--月份加减:
SELECT add_months(SYSDATE,-14) FROM DUAL;

--TIMESTAMP时间格式
SELECT *
FROM V$ACTIVE_SESSION_HISTORY T
WHERE T.SAMPLE_TIME > TO_TIMESTAMP('2017-05-18 16:41:00',  'YYYY-MM-DD HH24:MI:SS')
AND T.SAMPLE_TIME < TO_TIMESTAMP('2017-05-18 16:43:00',  'YYYY-MM-DD HH24:MI:SS')


mysql

SELECT COUNT(*)
FROM MY_TABLE T
WHERE T.CREATED_DATE >= '2016-08-12 09:12:00'
AND T.CREATED_DATE < '2016-08-12 10:12:00';

--大于一月前
SELECT COUNT(*)
FROM MY_TABLE T
WHERE T.CREATED_DATE > DATE_SUB(now(), INTERVAL 1 month);

select date_add(now(), interval 1 minute);  --一分钟后
select date_add(now(), interval 1 second);  --一秒后
select date_add(now(), interval 1 week);  --一周后

--获取当前时间的秒数:
SELECT TIMESTAMPDIFF(SECOND, '1970-1-1 8:0:0', NOW());  --1506847510


PostgreSQL

--当前时间
select current_time;   --"16:40:25.083395+08"
select now();    --"2017-10-01 16:41:03.689542+08"

--查询大于两天前的数据
select * from my_table t where t.created_date > now() - interval '2 day';

--查询大于两天后的数据
select * from my_table t where t.created_date < now() + interval '2 day';

--查询条件为大于某个时刻
select * from my_table t where t.created_date > to_date('2016-08-20 00:00:00','yyyy-mm-dd hh24:mi:ss');

--返回当前描述
select round(extract(epoch from now()));  --1506847426


时间切割

oracle

--每五分钟:
SELECT *
FROM MY_TABLE T
WHERE T.DATE_CREATED BETWEEN
TRUNC(SYSDATE) + TRUNC(TO_CHAR(SYSDATE, 'sssss') / 300 - 1) / 288 AND
TRUNC(SYSDATE) + TRUNC(TO_CHAR(SYSDATE, 'sssss') / 300) / 288 - 1 / 86400;

--每一分钟
SELECT TRUNC(SYSDATE) + TRUNC(TO_CHAR(SYSDATE, 'sssss') / 60 - 1) / 1440,
TRUNC(SYSDATE) + TRUNC(TO_CHAR(SYSDATE, 'sssss') / 60) / 1440 - 1 / 86400
FROM DUAL;


结果如下:

startend
2017/10/2 11:11:002017/10/2 11:11:59
--每一小时
SELECT TRUNC(SYSDATE) + TRUNC(TO_CHAR(SYSDATE, 'sssss') / 3600 - 1) / 24,
TRUNC(SYSDATE) + TRUNC(TO_CHAR(SYSDATE, 'sssss') / 3600) / 24 - 1 / 86400
FROM
4000
DUAL;


结果如下:

startend
2017/10/2 10:00:002017/10/2 10:59:59

mysql

--每一个小时
SELECT DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-%d'),
INTERVAL FLOOR(TIME_TO_SEC(NOW()) / 3600 - 1) * 3600 SECOND),
DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-%d'),
INTERVAL FLOOR(TIME_TO_SEC(NOW()) / 3600) * 3600 - 1 SECOND);


结果如下:

startend
2017-10-02 10:00:002017-10-02 10:59:59
--每五分钟
SELECT DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-%d'),
INTERVAL FLOOR(TIME_TO_SEC(NOW()) / 300 - 1) * 300 SECOND),
DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-%d'),
INTERVAL FLOOR(TIME_TO_SEC(NOW()) / 300) * 300 - 1 SECOND);


结果如下:

startend
2017-10-02 11:00:002017-10-02 11:04:59

PostgreSQL

--每五分钟(两种方式)
SELECT (DATE_TRUNC('hour', NOW()) + (DATE_PART('minute', NOW()) ::INT / 5 - 1) * INTERVAL '5 min'),
(DATE_TRUNC('hour', NOW()) + DATE_PART('minute', NOW()) ::INT / 5 * INTERVAL '5 min' - INTERVAL '1 second');
SELECT TIMESTAMP WITH TIME ZONE 'epoch' + ROUND(EXTRACT(EPOCH FROM NOW()) ::INT / 300 - 1) * INTERVAL '300 second',
TIMESTAMP WITH TIME ZONE 'epoch' + ROUND(EXTRACT(EPOCH FROM NOW()) ::INT / 300) * INTERVAL '300 second' - INTERVAL '1 second';


结果如下:

startend
2017-10-02 10:55:00+082017-10-02 10:59:59+08
--每一小时(两种方式)
SELECT (DATE_TRUNC('day', NOW()) + (DATE_PART('hour', NOW()) ::INT / 1 - 1) * INTERVAL '1 hour'),
(DATE_TRUNC('day', NOW()) + DATE_PART('hour', NOW()) ::INT / 1 * INTERVAL '1 hour' - INTERVAL '1 second');
SELECT TIMESTAMP WITH TIME ZONE 'epoch' + ROUND(EXTRACT(EPOCH FROM NOW()) ::INT / 3600 - 1) * INTERVAL '3600 second',
TIMESTAMP WITH TIME ZONE 'epoch' + ROUND(EXTRACT(EPOCH FROM NOW()) ::INT / 3600) * INTERVAL '3600 second' - INTERVAL '1 second';


结果如下:

startend
2017-10-02 09:00:00+082017-10-02 09:59:59+08
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  postgresql oracle mysql