以下以2013年11月為例
創(chuàng)新互聯(lián)建站主營淮南網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,手機APP定制開發(fā),淮南h5小程序定制開發(fā)搭建,淮南網(wǎng)站營銷推廣歡迎淮南等地區(qū)企業(yè)咨詢
1、使用橫向連接,以5天為例,簡單但不易擴展
with data as ( select * from yourtable where date='2013-11-01' and date'2013-12-01')
select distinct name
from data t1 join data t2 on t1.name=t2.name and t1.date=t2.date+1
join data t3 on t2.name=t3.name and t2.date=t3.date+1
join data t4 on t3.name=t4.name and t3.date=t4.date+1
join data t5 on t4.name=t5.name and t4.date=t5.date+1
2、使用縱向分組統(tǒng)計
with t1(id,rq) as (
select distinct 人員, date from 表 where date='2013-11-01' and date'2013-12-01' ),
--t1求出指定月的人員編號及不同的打卡日期
t2 as (select s2.* from t1 s1 join t1 s2 on s1.id=s2.id and s1.rq=s2.rq-1),
--t2求出所有上一日也打過卡的日期
t3 as (select * from t1 except select * from t2),
--t3求出所有上一日未打過卡的日期
t as (
select id,rq,1 days from t3
union all
select t1.id,t1.rq,t.days+1 from t1 join t on t1.id=t.id and t1.rq=t.rq+1
)
--t4遞歸調(diào)用,每連續(xù)一日days+1,就是求每一打卡時間是連續(xù)的第幾天
select id
from t
group by id
having max(days)=5
order by id
以上就不刪了,以下可以改短點吧
with t as (
select 人員 id, date rq, 1 days from 表 t1
where not exists(select * from 表 t2 where t2.date=t1.date-1)
union all
select t1.id,t1.rq,t.days+1 from 表 t1 join t on t1.id=t.id and t1.rq=t.rq+1
)
select id
from t
group by id
having max(days)=5
order by id
select year(日期),month(日期),is_working_day,count(*) from table group by is_working_day order by year(日期),month(日期);
mysql的寫法,如果sqlserver,
year(日期),month(日期) 換成
DateName(year,日期),DateName(month,日期)
試試select
dateadd
例如:向日期加上2天
select
dateadd(day,2,'2004-10-15')
--返回:2004-10-17
00:00:00.000
dateadd函數(shù)說明:
DateAdd
(interval,number,date)
以interval指定的方式,加上number之后的日期
參數(shù)
interval的設定值如下:
值
縮
寫(Sql
Server)
(Access
和
ASP)
說明
Year
Yy
yyyy
年
1753
~
9999
Quarter
q
季
1
~
4
Month
Mm
m
月1
~
12
Day
of
year
Dy
y
一年的日數(shù),一年中的第幾日
1-366
Day
Dd
d
日,1-31
Weekday
Dw
w
一周的日數(shù),一周中的第幾日
1-7
Week
Wk
ww
周,一年中的第幾周
~
51
Hour
Hh
h
時0
~
23
Minute
Mi
n
分鐘0
~
59
Second
Ss
s
秒
~
59
Millisecond
Ms
-
毫秒
~
999
可用如下sql語句:
select?convert(varchar(10),dateadd(DAY,t2.number,t1.day),120)?day?from
(select?'2015-07'+'-01'?day)?t1,
(select?number?from?MASTER..spt_values?WHERE?TYPE='P'?AND?number=0?and?number=31)?t2
where?convert(varchar(10),dateadd(DAY,t2.number,t1.day),120)?like?'2015-07%'
說明:要查詢某年某月,只許將語句中的2015-07替換即可。
結(jié)果截圖: