1. 程式人生 > >sql sever 表內資料修改(含判斷)

sql sever 表內資料修改(含判斷)

舉例:

1、修改時間,將時間的時分改為0

2、判斷時間是上午下午

程式碼

UPDATE PA_Visit_Info 
SET Visit_Date = STUFF(CONVERT(VARCHAR(23),Visit_Date,120), 12, 5, '00:00'),
Date_APM = CASE when DATENAME(HOUR, Visit_Date)<12 THEN '上午' ELSE '下午' END

資料表圖


額外補充:

時間格式化

<code>
    SELECT CONVERT(varchar(100), GETDATE(), 0) 05  9 2011  9:12AM
    SELECT CONVERT(varchar(100), GETDATE(), 1) 05/09/11
    SELECT CONVERT(varchar(100), GETDATE(), 2) 11.05.09
    SELECT CONVERT(varchar(100), GETDATE(), 3) 09/05/11
    SELECT CONVERT(varchar(100), GETDATE(), 4) 09.05.11
    SELECT CONVERT(varchar(100), GETDATE(), 5) 09-05-11
    SELECT CONVERT(varchar(100), GETDATE(), 6) 09 05 11
    SELECT CONVERT(varchar(100), GETDATE(), 7) 05 09, 11
    SELECT CONVERT(varchar(100), GETDATE(), 8) 09:13:14
    SELECT CONVERT(varchar(100), GETDATE(), 9) 05  9 2011  9:13:14:670AM
    SELECT CONVERT(varchar(100), GETDATE(), 10) 05-09-11
    SELECT CONVERT(varchar(100), GETDATE(), 11) 11/05/09
    SELECT CONVERT(varchar(100), GETDATE(), 12) 110509
    SELECT CONVERT(varchar(100), GETDATE(), 13) 09 05 2011 09:13:14:670
    SELECT CONVERT(varchar(100), GETDATE(), 14) 09:13:14:670
    SELECT CONVERT(varchar(100), GETDATE(), 20) 2011-05-09 09:13:14
    SELECT CONVERT(varchar(100), GETDATE(), 21) 2011-05-09 09:13:14.670
    SELECT CONVERT(varchar(100), GETDATE(), 22) 05/09/11  9:15:33 AM
    SELECT CONVERT(varchar(100), GETDATE(), 23) 2011-05-09
    SELECT CONVERT(varchar(100), GETDATE(), 24) 09:15:33
    SELECT CONVERT(varchar(100), GETDATE(), 25) 2011-05-09 09:15:33.140
    SELECT CONVERT(varchar(100), GETDATE(), 100) 05  9 2011  9:15AM
    SELECT CONVERT(varchar(100), GETDATE(), 101) 05/09/2011
    SELECT CONVERT(varchar(100), GETDATE(), 102) 2011.05.09
    SELECT CONVERT(varchar(100), GETDATE(), 103) 09/05/2011
    SELECT CONVERT(varchar(100), GETDATE(), 104) 09.05.2011
    SELECT CONVERT(varchar(100), GETDATE(), 105) 09-05-2011
    SELECT CONVERT(varchar(100), GETDATE(), 106) 09 05 2011
    SELECT CONVERT(varchar(100), GETDATE(), 107) 05 09, 2011
    SELECT CONVERT(varchar(100), GETDATE(), 108) 09:16:38
    SELECT CONVERT(varchar(100), GETDATE(), 109) 05  9 2011  9:16:38:543AM
    SELECT CONVERT(varchar(100), GETDATE(), 110) 05-09-2011
    SELECT CONVERT(varchar(100), GETDATE(), 111) 2011/05/09
    SELECT CONVERT(varchar(100), GETDATE(), 112) 20110509
    SELECT CONVERT(varchar(100), GETDATE(), 113) 09 05 2011 09:17:19:857
    SELECT CONVERT(varchar(100), GETDATE(), 114) 09:17:19:857
    SELECT CONVERT(varchar(100), GETDATE(), 120) 2011-05-09 09:17:19
    SELECT CONVERT(varchar(100), GETDATE(), 121) 2011-05-09 09:17:19.857
    SELECT CONVERT(varchar(100), GETDATE(), 126) 2011-05-09T09:17:19.857
    SELECT CONVERT(varchar(100), GETDATE(), 130)  6 ????? ??????? 1432  9:17:19:857AM
    SELECT CONVERT(varchar(100), GETDATE(), 131)  6/06/1432  9:17:19:857AM
</code>

其他常用函式方法:

SubString():用於擷取指定字串的方法。該方法有三個引數:

引數1:用於指定要操作的字串。

引數2:用於指定要擷取的字串的起始位置,起始值為 1 。

引數3:用於指定要擷取的長度。

select substring('abcdef',1,3)    -- 返回 abc

select substring('123456321',0,2)    -- 返回 1,即第一位,最好不要這樣做

Left():用於返回指定字串中指定長度的左側部分。該方法有兩個引數:

引數1:用於指定要操作的字串。

引數2:用於指定要返回的子字串的長度。

select
LEFT('abc123',3) -- 返回 abc select LEFT('左側部分右側部分',4) -- 返回 左側部分

Right():用於返回指定字串中指定長度的右側部分。該方法有兩個引數:

引數1:用於指定要操作的字串。

引數2:用於指定要返回的子字串的長度。

select RIGHT('abc123',3)        -- 返回 123

select RIGHT('左側部分右側部分',4)    -- 返回 右側部分

CharIndex():用於返回指定字串中指定子字串出現的起始位置。如果未找到就返回 0。該方法有兩個引數:

引數1:用於指定要進行查詢的字串。

引數2:用於指定用作檢索的字串。

select charindex('a','123a123')        -- 返回 4

select charindex('abc','123a123')    -- 返回 0

select charindex('abc','123abc123')    -- 返回 4

Stuff():用於刪除指定長度的字元,並在刪除的位置插入新的字元/值。該方法有四個引數:

引數1:用於指定要操作的字串。

引數2:用於指定要刪除字元的起始位置。

引數3:用於指定要刪除字元的長度。

引數4:用於指定在刪除的位置插入的新的字串/值。

select stuff('123abc456',4,3,'ABC')        -- 返回 123ABC456

select stuff('123abc456',1,3,'')    -- 返回 abc456,用空字串替代

 Len():用於返回指定文字的值的長度。前導空格計算在內,尾隨空格不計算在內。該方法有一個引數:

引數1:用於指定要操作的文字或字串。

select len('123')    -- 返回 3

select len('字串')    -- 返回 3

Difference():用於返回一個整數值,指示兩個字元表示式的 SOUNDEX 值之間的差異。(即兩個字串的相似度)那麼什麼是 SOUNDEX 值呢?先記著,下面輪到它了。

返回的值從 0 到 4 不等:0 表示幾乎不同或完全不同,4 表示幾乎相同或完全相同。該方法有兩個引數:

引數1:用於指定要進行比對的第一個字串 SOUNDEX 值 。

引數2:用於指定要進行比對的第二個字串 SOUNDEX 值。

select difference('action','demo')        -- 返回 2

select difference('123456','整數')        -- 返回 4

Soundex():用於返回指定字串的 SOUNDEX 值。SOUNDEX是一種語音演算法,利用英文字的讀音計算近似值,值由四個字元構成,第一個字元為英文字母,後三個為數字。在拼音文字中有時會有會念但不能拼出正確字的情形,可用 Soundex 做類似模糊匹配的效果。這裡的模糊匹配跟 LIKE 不同。

演算法簡要說明:

複製程式碼
-- 將英文字按以下規則替換(不使用第一個字元進行匹配,並且不使用對應值為 0 的英文字元的值)
    a e h i o u w y -> 0
    b f p v -> 1
    c g j k q s x z -> 2
    d t -> 3
    l -> 4
    m n -> 5
    r -> 6
複製程式碼

如果字串中存在擁有相同對應數字的2個或以上的字母在一起(例如 j 和 k),則刪除其他的,只保留1個。去除對應值為 0 的字元,只返回前4個位元組,不夠用 0 填充。

select soundex('string')    -- 返回 S215

select soundex('str')    -- 返回 S210
select soundex('123')    -- 返回 0000

select soundex('字串')    -- 返回 0000

PS:除英文字元以外的字元都將返回 0000,所以上面的方法 Difference() 的第二個示例會返回4(表示完全相同)。

Lower():用於返回指定英文字串的小寫形式的字串。如果不為英文字串,則返回原值。該方法有一個引數:

引數1:用於指定要轉換為小寫形式的字串。

select lower('ABC')        -- 返回 abc

select lower('123')    -- 返回 123

Upper():用於返回指定英文字串的大寫形式的字串。如果不為英文字串,則返回原值。該方法有一個引數:

引數1:用於指定要轉換為大寫形式的字串。

select upper('abc')        -- 返回 ABC

select upper('123')    -- 返回 123

Ltrim():用於返回刪除前導空格之後的字串。該方法有一個引數:

引數1:用於指定要進行刪除前導空格操作的字串。

複製程式碼
select ltrim('        123')        -- 返回 123

select ltrim('        好多空格')    -- 返回 好多空格

select len('        123')    -- 返回 11

select len(ltrim('        123'))  -- 返回 3
複製程式碼

Rtrim():用於返回截斷尾隨空格之後的字串。該方法有一個引數:

引數1:用於指定要進行截斷尾隨空格操作的字串。

select rtrim('123         ')        -- 返回 123

select len(rtrim('123         '))  -- 返回 3

Replace():用第三個表示式替換第一個字串表示式中出現的所有第二個給定字串表示式。該方法有三個引數:

引數1:用於指定要操作的字串,即被匹配的字串。

引數2:用於指定要進行匹配的字串。

引數3:用於指定用作替換存在的匹配項的字串。

--把 abc 替換為 xxx 
select replace('123abc456','abc','xxx')        -- 返回 123xxx456

-- 用空字串替換匹配項
select replace('123abc456','abc','')    -- 返回 123456

 Unicode():根據 Unicode 標準返回指定字元或字串的第一個字元的整數值。該方法有一個引數:

引數1:用於指定要操作的字元或字串。

select unicode('a')        -- 返回 97

select unicode('abc')    -- 返回 97,只返回第一個字元

NChar():根據 Unicode 標準返回指定整數值程式碼的 Unicode 字元。該方法有一個引數:

引數1:指定一個 Unicode 標準的整數值程式碼。

select nchar(97)    -- 返回 a

select nchar(65)    -- 返回 A

Char():將指定的 int 型別的值轉換為 ASCII 程式碼。該方法有一個引數:

引數1:指定一個 int 型別的數值,值範圍為 0 至 255。返回 null 表示整數表示式不是在此範圍內。

複製程式碼
select char(99)    -- 返回 c

select char(9)    -- Tab符

select char(10)    -- 換行符

select char(13)    -- 回車符
複製程式碼

ASCII():返回指定字元或字串的第一個字元的 ASCII 程式碼值。該方法有一個引數:

引數1:用於指定要操作的字元或字串。

select ascii('A')    -- 返回 65

select ascii('a')    -- 返回 97

PS:ASCII() 用於操作單位元組,雙位元組請使用 Unicode()。全形字元為雙位元組、中文字元為雙位元組。

示例:

複製程式碼
select unicode('字串')    -- 返回 23383

select nchar('23383')    -- 返回 字

select char('23383')    -- 返回 NULL

select ascii('字串')    -- 返回 215

select nchar('215')    -- 返回 ×

select char('215')    -- 返回 NULL

select ascii('Kan')    -- 返回 75

select nchar('75')    -- 返回 K

select char('75')    -- 返回 K
複製程式碼

Str():返回一個指定數值的等效字串。該方法有三個引數:

引數1:指定要操作的數值。

引數2:指定要返回字串的長度。預設值為10,即不指定預設長度為10,不足用空字元填充。

引數3:要返回的小數位數。預設值為0,即不指定就不保留小數,不足指定位數,用0補充。

複製程式碼
select str(123.10)    -- 返回        123

select len(str(123.10))    -- 返回 10

select str(123.10,5)    -- 返回   123

select len(str(123.10,5))    -- 返回 5

select str(123.10,20,5)        -- 返回            123.10000

select len(str(123.10,20,5))    -- 返回 20
複製程式碼

Space():用於返回指定數值長度的空格字串。該方法有一個引數:

引數1:指定返回空格字串的長度。

select '1'+space(3)+'2'        -- 返回 1   2

select len('1'+space(3)+'2')    -- 返回 5

Reverse():用於對指定字串進行反轉,按照單個字元進行反轉。該方法有一個引數:

引數1:指定需要執行反轉操作的字串。

select reverse('123')    -- 返回 321

select reverse('abc')    -- 返回 cba

Replicate():用於返回一個對指定字串重複指定次數後的字串。該方法有兩個引數:

引數1:用於指定要操作的字串。

引數2:用於指定字串重複的次數。如果為0,返回空字串;如果為負數,則返回 null。

select replicate('123',3)    -- 返回 123123123

select replicate('a',3)        -- 返回 aaa

Quotename():返回一個 Unicode 字串,根據指定分隔符,返回一個有效的字串識別符號。該方法有兩個引數:

引數1:用於指定要操作的字串。

引數2:用於指定分隔符,可以是單引號(')、左括號([)、右括號(])、左右括號([])或雙引號(")。如果未指定,預設使用左右括號。

複製程式碼
select quotename('123','[]')    -- 返回 [123]

select quotename('123','''')    -- 返回 '123'

select quotename('123','"')        -- 返回 "123"

select quotename('12[]3','[]')    -- 返回 [12[]]3],右括號加倍表示轉義字元。
複製程式碼

Patindex():返回指定字串表示式中指定模式第一次出現的起始位置,未找到則返回0。該方法有兩個引數:

引數1:指定要匹配的字串及匹配模式。

引數2:指定要被匹配的字串表示式。

複製程式碼
select Patindex('abc','123abc456abc789')    -- 返回 0

select Patindex('abc','abc')    -- 返回 1

select Patindex('abc%','123abc456abc789')    -- 返回 0

select Patindex('%abc%','123abc456abc789')    -- 返回 4

select Patindex('%[abc]%','123abc456abc789')    -- 匹配字串 abc 第一次出現的位置,返回 4

select Patindex('%[^abc]%','123abc456abc789')    -- 匹配不等於字元 a、b、c 的其他字元第一次出現的位置,返回 1

select Patindex('%[^abc]%','b123abc456abc789')    -- 匹配不等於字元 a、b、c 的其他字元第一次出現的位置,返回 2
複製程式碼

Parsename():返回物件名稱的指定部分。 可檢索的物件部分包括物件名稱、所有者名稱、資料庫名稱和伺服器名稱。其實也可以用於擷取字串。該方法有兩個引數:

引數1:要檢索其指定部分的物件的名稱。此名稱可包含四部分:伺服器名稱、資料庫名稱、所有者名稱以及物件名稱。

引數2:要返回的物件部分。只能為1至4的數值。1 = 物件名稱;2 = 架構名稱;3 = 資料庫名稱;4 = 伺服器名稱

select parsename('server.dbo.dbTest.table',1) tablename,
       parsename('server.dbo.dbTest.table',2) dbname,
       parsename('server.dbo.dbTest.table',3) schemaname,
       parsename('server.dbo.dbTest.table',4) servername

這種擷取方式類似於字串分割,不過這裡是倒著擷取的,所以在一定程度上可以用於字串的擷取。不過只支援小數點(.)的分割,而且只支援四位。

select parsename('192.168.1.1',4) col1,
       parsename('192.168.1.1',3) col2,
       parsename('192.168.1.1',2) col3,
       parsename('192.168.1.1',1) col4

Getdate():獲取當前日期時間。

select getdate()

Year():獲取指定日期表示式的年。該方法有一個引數:

引數1:指定要操作的日期表示式。

select year('2016-01-01')    -- 返回 2016

select year('2017-01-01 12:30:30')    -- 返回 2017

select year(getdate())    -- 返回 2017

Month():獲取指定日期表示式的月。該方法有一個引數:

引數1:指定要操作的日期表示式。

select month('2016-01-01')    -- 返回 1

select month('2017-10-01 12:30:30')    -- 返回 10

select month(getdate())    -- 返回 5

Day():獲取指定日期表示式的日。該方法有一個引數:

引數1:指定要操作的日期表示式。

select day('2016-01-01')    -- 返回 1

select day('2017-10-03 12:30:30')    -- 返回 3

select day(getdate())    -- 返回 11

Isdate():用於判斷指定的字串表示式是否為日期。返回 1,表示指定字串表示式是日期。返回 0,表示指定字串表示式不是日期。該方法有一個引數:

引數1:用於指定要操作的字串表示式。

複製程式碼
select isdate('10/30/2017')        -- 月/日/年        返回 1

select isdate('30/10/2017')        -- 日/月/年        返回 0

select isdate('2017/10/30')        -- 年/月/日        返回 1

select isdate('02/29/2017')        --用於判斷閏年,由於2017不是閏年,所以沒有29     返回 0

select isdate('2017-01-01')        -- 返回 1

select isdate('2017-01-01 10:10:10')    -- 返回 1

select isdate('01-01-2017')        -- 返回 1

select isdate('01-01-2017 10:10:10')    -- 返回 1
複製程式碼

Datename():返回指定日期的指定日期的部分的字串。該方法有兩個引數:

引數1:指定返回指定日期的指定部分的字串。可以為下圖中的日期部分或者縮寫。

引數2:指定要操作的日期字串。

複製程式碼
select datename(year,'2017-01-01 10:10:10')    -- 返回 2017
select datename(yyyy,'2017-01-01 10:10:10')    -- 返回 2017

select datename(month,'2017-01-01 10:10:10')    -- 返回 01
select datename(mm,'2017-01-01 10:10:10')    -- 返回 01
    
select datename(quarter,'2017-05-02 10:10:10')        -- 表示一年的第幾個季度        返回 2
select datename(weekday,'2017-02-02 10:10:10')        -- 表示一週的星期幾        返回 星期四
select datename(week,'2017-02-02 10:10:10')        -- 表示一年的第幾周        返回 5
select datename(dayofyear,'2017-02-02 10:10:10')        -- 表示一年的第幾天        返回 33

select datename(hh,'2017-01-01 10:30:25')    -- 返回 10
複製程式碼

Datepart():返回指定日期的指定日期的部分的整數。Datepart() 方法和 Datename() 的方法使用方式類似,只不過 Datename() 方法返回的是一個字串,而 Datepart() 方法返回的是一個整數數值。該方法有兩個引數:

引數1:指定返回指定日期的指定部分的字串。可以為上圖中的日期部分或者縮寫。

引數2:指定要操作的日期字串。

複製程式碼
select datepart(year,'2017-01-01 10:10:10')    -- 返回 2017
select datepart(yyyy,'2017-01-01 10:10:10')    -- 返回 2017

select datepart(month,'2017-01-01 10:10:10')    -- 返回 1
select datepart(mm,'2017-01-01 10:10:10')    -- 返回 1
    
select datepart(quarter,'2017-05-02 10:10:10')        -- 表示一年的第幾個季度        返回 2
select datepart(weekday,'2017-02-02 10:10:10')        -- 表示一週的星期幾,即一週的第幾天,星期日為一週的第一天    返回 5
select datepart(week,'2017-02-02 10:10:10')        -- 表示一年的第幾周        返回 5
select datepart(dayofyear,'2017-02-02 10:10:10')        -- 表示一年的第幾天        返回 33

select datepart(hh,'2017-01-01 10:30:25')    -- 返回 10
複製程式碼

 Coalesce():返回所有引數中的第一個非空(not null)表示式。該方法最多可以有 n 個引數,但是最少要有兩個引數。

SELECT COALESCE('abc','')    -- 返回 abc

SELECT COALESCE(NULL,'')    -- 返回 空字串

SELECT COALESCE(null,null,'123','abc')    -- 返回 123

PS:這個函式是返回第一個非空的值,所以引數裡面必須最少有一個非空的值。

ISNull():判斷指定的表示式一是否為空(null),如果為空則返回表示式二的值,否則返回表示式一的值,類似於C#中的三元運算子。該方法有兩個引數:

引數1:指定要操作的表示式一。

引數2:指定要操作的表示式二。

複製程式碼
select isnull('','123')        -- 返回 空字串

select isnull(null,'123')        -- 返回 123

select isnull('123','abc')        -- 返回 123

select isnull(null,null)    -- 返回 null
複製程式碼


其他方法函式轉載來自:https://www.cnblogs.com/Brambling/p/6779434.html