做統計分析的時候,總有些按日期查詢。比如近 7 天資料,近 30 天資料,當月資料之類的。但是表中的日期並不一定是連續的,這就需要構建乙個日期序列作為主表查詢。每次做這類查詢都要baidu半天怎麼構建日期序列,今天記錄一下。
1、建立日期表
這個方法是在前公司偶然見到的。顧名思義就是建立一張資料表,裡面儲存了從當天開始一直向前推得日期資料,示例如下:
這種方式太簡單了,就不貼 sql 了。
2、建立數字序列表
使用日期序列表太麻煩了,我們可以借助乙個數字序列表來實現上述查詢,示例如下:
然後 sql 就是這樣的了:
-- 最近7天序列
select
date_format(date_add(
now(),
interval
@i :=@i-
1day),
'%y-%m-%d'
)date
from
number join
(select
@i :=
1) t
where
seq <=7;
-- 當前周每天序列
select
date_format(date_add(
now(),
interval
@i :=@i-
1day),
'%y-%m-%d'
)date
from
number join
(select
@i :=
1) t
where
seq <=
(weekday(
now())
+1);
-- 當前月每天序列
select
date_format(date_add(
now(),
interval
@i :=@i-
1day),
'%y-%m-%d'
)date
from
number join
(select
@i :=
1) t
where
seq <=
(dayofmonth(
now())
);-- 最近6個月序列
select
date_format(date_add(
now(),
interval
@i :=@i-
1month),
'%y-%m'
)date
from
number join
(select
@i :=
1) t
where
seq <=6;
-- 當前年每月序列
select
date_format(date_add(
now(),
interval
@i :=@i-
1month),
'%y-%m'
)date
from
number join
(select
@i :=
1) t
where
seq <=
(month
(now()));
不得不說,還是 oracle 強大
-- 最近7天序列
select to_char(sysdate -
level+1
,'yyyy-mm-dd'
) date_seq from dual connect
bylevel
<=7;
-- 當前周每天序列
select to_char(sysdate -
level+1
,'yyyy-mm-dd'
) date_seq from dual connect
bylevel
<= trunc(sysdate - trunc(sysdate,
'd')-1
)+1;
-- 當前月每天序列
select to_char(sysdate -
level+1
,'yyyy-mm-dd'
) date_seq from dual connect
bylevel
<= to_char(sysdate,
'dd');
-- 最近6個月序列
select to_char(add_months(sysdate,
-level+1
),'yyyy-mm'
)month
from dual connect
bylevel
<=6;
-- 當前年每月序列
select to_char(add_months(sysdate,
-level+1
),'yyyy-mm'
)month
from dual connect
bylevel
<= to_char(sysdate,
'mm'
);
有了這幾個基本的,其他的變種應該也不難寫了。 mySql oracle分頁機制
mysql oracle分頁機制 1.mysql中的limit關鍵字 以模糊查詢為例子,limit寫到where子句的後面 select from user where name like mm limit startrow,readsize 其中值得推敲的是startrow和readsize也就是...
Mysql Oracle的資料遷移
當我們遇到資料量較大的資料遷移時,並且還是跨資料庫操作,則建議用資料庫的自帶工具比較好!本例子介紹由mysql oracle的用資料庫的自帶工具資料遷移!第一步 將資料從mysql中提取出來到檔案,用到shell指令碼,sql指令碼如下 主要用到 select from into outfile m...
mysql oracle的字段連線
mysql concat str1,str2,其中,如果str1裡面有單引號,需要在單引號前面加上 就可以不轉義,如 flagnation oracle str1 str2 其中,如果str1裡面有單引號,需要在單引號前面再加乙個單引號,就可以不轉義,如 select insert into enu...