1. 程式人生 > >SQL Server模糊查詢,日期查詢

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 = '休息休息'