SQL Server模糊查詢,日期查詢
首先看下SQL的查詢有關的萬用字元
開啟菜鳥教程
模糊查詢
舉個例子,在sql server中
比如“一元天”這些字的順序可以是任意的,而且也可以不相鄰,把所有的情況都查詢出來:
。。。一。。。元。。。天。。。”
“天;;;;元。。。一。。。”等好多情況
SELECT * FROM OneTable WHERE CHARINDEX(N'一', Field)>0 AND CHARINDEX(N'元', Field)>0 AND CHARINDEX(N'天', Field)>0
在資料查詢的時候,有完整查詢和模糊查詢之分.在Access和SQL Server中使用模糊查詢有一下幾種查詢:
1.用_萬用字元查詢
"_"號表示任意單個字元,該字元號只能匹配一個字元,利用"_"號可以作為萬用字元組成匹配模式進行查詢."_"符號可以放在查詢條件 的任意位置,且只能代表一個字元.
例如:查詢數學成績在大於或等於80的同學
selecT * FROM StuScore WHERE Math_Score like ‘8_’
2利用%萬用字元查詢
"%"符號是字元匹配符,能匹配0個或更多字元的任意長度的字串.
在SQL語句中可以在查詢條件的任意位置放置一個%來代表一個任意長度的字串,在查詢條件是也可以放置兩個%進行查詢,但是 在查詢條件中最好不要連續出現連個%
例如:查詢姓劉的學生成績
select * from StuScore where Name like ‘劉%’
3使用[]萬用字元查詢
利用[]來實現查詢一定範圍的資料,[]號用於指定範圍內的任何單個字元,包括兩端資料.
[]中應用的主要萬用字元
符號 |
含義 |
Like ‘5[%]’ |
5% |
Like ‘5%’ |
5後面跟0個或者多個字元的字串 |
Like ‘[_]n’ |
_n |
Like’[a-cdf]’ |
a,b,c,d,or f |
Like ‘_n’ |
An ,in, on,(and so on ) |
Like ‘[-acdf]’ |
-a,c,d, or f |
Like’[[]’ |
[ |
Like ‘]’ |
] |
例如:查詢英語成績在95到100之間的同學
select * from StuScore where English_Score like ‘9[5-9]%’
5.利用[^]萬用字元查詢
[^]號用來查詢不在指定範圍或集合內的任何單個字元
例如:查詢數學成績在90分以下的學生
select * from StuScore where Math_Score like ‘[^9][0-9]’
5.OT AND OR 邏輯運算子查詢
綜合應用了模式查詢中的幾種形式,同時還使用了NOT ,AND ,OR3種邏輯運算子組成完整的查詢條件,其中,NOT的優先順序最高,其次是AND,OR的優先順序最低,在使用3種邏輯運算子進行查詢時,注意運算子的優先級別,通過括號也可以改變優先級別,使查詢功能更加豐富和靈活,
注:NOT 表示"非"的關係,表示不滿足NOT後面條件.OR表示"或"的關係,即滿足兩個條件中的一個,AND表示"與"的關係,即同時滿足兩個關係
例如:查詢姓劉的學生數學成績以最後一位數不是7或者是英語在90分以上的
selecT * FROM StuScore WHERE (Name like ‘劉%’) and ((Math_Score like ‘[^7]’) or(English_Score like ‘9[0-9]’))
6.Jet SQL 語法中使用萬用字元
like運算子裡使用的萬用字元列表
萬用字元 |
描述 |
? |
任何單一字元 |
· |
零個或者多個字元 |
# |
任何單一數字(0-9) |
[字串列表] |
任何在字串列表中的單一字元 |
[!字串列表] |
任何不在字串列表中的單一字元 |
用運算子like處理文字資料型別的欄位
like謂詞用於查詢字串,使用時取"?"代表任意單個字元,"*"代表任意字串,其形式如下幾種情況
(1) 以字元loving 開頭的任何文字:
Like ‘loving*’
(2)包含字元loving結尾的任何文字
Like ‘*loving’
(3)包含字元loving的任何文字
Like ‘*loving*’
(4)去字元 loving和單個任意字尾字元
Like ‘loving?’
(5)取字元loving和單個 任意字首字元
Like ‘?loving’
(6)以字元L或V開頭的任何文字
Like ‘[lv]*’
(7)結尾為s,開頭字元位於m~r之間的文字:
Like ‘[m-r]s’
(8)以字元m開頭,第二個字元非r的任何文字
Like ‘m[^r]*’
日期查詢
Sql Server日期查詢-SQL查詢今天、昨天、7天內、30天
今天的所有資料:select * from 表名 where DateDiff(dd,datetime型別欄位,getdate())=0
昨天的所有資料:select * from 表名 where DateDiff(dd,datetime型別欄位,getdate())=1
7天內的所有資料:select * from 表名 where DateDiff(dd,datetime型別欄位,getdate())<=7
30天內的所有資料:select * from 表名 where DateDiff(dd,datetime型別欄位,getdate())<=30
本月的所有資料:select * from 表名 where DateDiff(mm,datetime型別欄位,getdate())=0
本年的所有資料:select * from 表名 where DateDiff(yy,datetime型別欄位,getdate())=0
查詢今天是今年的第幾天: select datepart(dayofyear,getDate())
查詢今天是本月的第幾天:1. select datepart(dd, getDate())
2.select day(getDate())
查詢本週的星期一日期是多少 (注意:指定日期不能是週日,如果是週日會計算到下週一去。所以如果是週日要減一天) SELECT DATEADD(wk,DATEDIFF(wk,0,getdate()),0)
查詢昨天日期:select convert(char,dateadd(DD,-1,getdate()),111) //111是樣式號,(100-114)
查詢本月第一天日期:Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) as firstday
查詢本月最後一天日期:Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) as lastday //修改-3的值會有相應的變化
本月有多少天:select datepart(dd,dateadd(dd,-1,dateadd(mm,1,cast((cast(year(getdate()) as varchar)+'-'+cast(month(getdate()) as varchar)+'-01' ) as datetime ))))
求兩個時間段相差幾天:select datediff(day,'2012/8/1','2012/8/20') as daysum
在指定的日期上±N天:select convert(char,dateadd(dd,1,'2012/8/20'),111) as riqi //輸出2012/8/21
在指定的日期上±N分鐘:select dateadd(mi,-15,getdate()) //查詢當前時間15分鐘之前的日期
時間範圍跨度大sql語句
做報表統計的時候會碰到從月初到月末的資料
這樣很好統計
如果是按時間段來統計,有該如何處理
比如1號到30號,統計7:30到9:50並且11:00到11:40並且15:01到18:59
時間範圍跨度大sql語句怎麼來拼湊
舉個例子說明
SELECT *
FROM RecordLogInfo
WHERE (1 = 1) AND (LogTime >= '2011-4-3 00:00:00') AND
(LogTime <= '2011-4-5 23:59:59') AND (DATEPART([Hour], LogTime) = 6 AND
DATEPART([Minute], LogTime) >= 0 OR
DATEPART([Hour], LogTime) = 7 AND DATEPART([Minute], LogTime) <= 59 OR
DATEPART([Hour], LogTime) >= 6 AND DATEPART([Hour], LogTime) < 7) AND
(DATEPART([Hour], LogTime) = 8 AND DATEPART([Minute], LogTime) >= 0 OR
DATEPART([Hour], LogTime) = 9 AND DATEPART([Minute], LogTime) <= 59 OR
DATEPART([Hour], LogTime) >= 8 AND DATEPART([Hour], LogTime) < 9) OR
(LogTime >= '2011-4-1 00:00:00') AND (LogTime <= '2011-4-2 23:59:59') AND
(DATEPART([Hour], LogTime) = 6 AND DATEPART([Minute], LogTime) >= 0 OR
DATEPART([Hour], LogTime) = 7 AND DATEPART([Minute], LogTime) <= 59 OR
DATEPART([Hour], LogTime) >= 6 AND DATEPART([Hour], LogTime) < 7) OR
(DATEPART([Hour], LogTime) = 8) AND (DATEPART([Minute], LogTime) >= 0) OR
(DATEPART([Hour], LogTime) = 9) AND (DATEPART([Minute], LogTime) <= 59) OR
(DATEPART([Hour], LogTime) >= 8) AND (DATEPART([Hour], LogTime) < 9)
主要使用了DATEPART([Hour], LogTime)函式,第一個引數時分秒,第二個引數資料庫datetime型別的欄位
這比並湊每天的好的多
查詢使用者輸入的起止時間
例如開始時間是 2017-01-30 結束時間是 2017-02-22
需要設定欄位的區間大於開始時間,小於結束時間
其中deliver_time是資料表查詢的欄位
select * from [tablename]
where DateDiff(dd,deliver_time,'2017-02-22')<= DATEDIFF(dd,'2017-01-30','2017-02-22') and DateDiff(dd,deliver_time,'2017-02-22')>=0
還可以增加其他的欄位作為約束的條件
select * from [tablename]
where DateDiff(dd,deliver_time,'2017-03-22')<= DATEDIFF(dd,'2017-01-30','2017-03-22') and DateDiff(dd,deliver_time,'2017-03-22')>=0
and type = '休息休息'