做一個(gè)自動(dòng)任務(wù),需要查詢(xún)指定期限內(nèi)數(shù)據(jù),比如按照自然月,按照自然日,按照自然周,需要支持Oracle 和 SqlServer數(shù)據(jù)庫(kù)。
數(shù)據(jù)庫(kù)中表字段receivetime,由C++負(fù)責(zé)寫(xiě)入,內(nèi)容為time_t的32位值,也就是1970年到現(xiàn)在的秒數(shù)。
研究了一天,得出如下語(yǔ)句:
對(duì)于SqlServer,
查詢(xún)前一天的數(shù)據(jù),
select * from table_name where datediff ( day, dateadd(day, (ReceiveTime+8*3600)/60/60/24 - 1, '19700101'), getdate() ) = 2;
請(qǐng)關(guān)注其中的8*3600,這是因?yàn)椋琒qlServer中,按照UTC計(jì)算標(biāo)準(zhǔn)時(shí)間,(ReceiveTime)/60/60/24計(jì)算的標(biāo)準(zhǔn)時(shí)間,但是數(shù)據(jù)庫(kù)服務(wù)器時(shí)區(qū)是東八區(qū),故需要加上這個(gè)值。
以下同理,不解釋。
查詢(xún)前一周的數(shù)據(jù),
查詢(xún)前一周
SELECT *
FROM tablename
WHERE datediff
(day,
dateadd
(day,
(ReceiveTime + 8 * 3600) / 60 / 60 / 24,
'1970-01-01 00:00:00'),
getdate ()) >= DatePart (Weekday, getdate ()) + 1
and
datediff
(day,
dateadd
(day,
(ReceiveTime + 8 * 3600) / 60 / 60 / 24,
'1970-01-01 00:00:00'),
getdate ()) <= DatePart (Weekday, getdate ()) + 8;
查詢(xún)前一月的數(shù)據(jù),
查詢(xún)前一月
SELECT *
FROM tablename
WHERE datediff
(month,
dateadd
(day,
(ReceiveTime + 8 * 3600) / 60 / 60 / 24,
'1970-01-01 00:00:00'),
getdate ()) = 1;
對(duì)于Oracle數(shù)據(jù)庫(kù)
查詢(xún)前一天:
查詢(xún)前一天
SELECT count(*)
FROM tablename
WHERE receivetime >=
((TRUNC (SYSDATE - 1, 'dd') - TO_DATE ('19700101', 'yyyymmdd')
)
* 24
* 3600 - 8 * 3600)
AND receivetime <
( (TRUNC (SYSDATE, 'dd') - TO_DATE ('19700101', 'yyyymmdd')
) * 24 * 3600 - 8 * 3600);
查詢(xún)前一周:
查詢(xún)前一周
SELECT count(*)
FROM tablename
WHERE receivetime <
( ( TRUNC (SYSDATE - TO_NUMBER (TO_CHAR (SYSDATE, 'W')) , 'dd')
- TO_DATE ('19700101', 'yyyymmdd')
)
* 24
* 3600 - 8 * 3600 )
AND receivetime >=
(( TRUNC (SYSDATE - TO_NUMBER (TO_CHAR (SYSDATE, 'W')) - 7, 'dd')
- TO_DATE ('19700101', 'yyyymmdd')
)
* 24
* 3600 - 8 * 3600 );
查詢(xún)前一月:
查詢(xún)前一月
SELECT count(*)
FROM tablename
WHERE receivetime >=
( ((trunc(last_day( add_months(sysdate, -2 )),'dd') + 1) - TO_DATE ('19700101', 'yyyymmdd')) * 24 * 3600 - 8 * 3600 )
AND receivetime < (((trunc(last_day( add_months(sysdate, -1 )),'dd') + 1) - TO_DATE ('19700101', 'yyyymmdd')) * 24 * 3600 - 8 * 3600);