1. 程式人生 > >sql 根據日期模糊查詢&SQL Server dateTime型別 模糊查詢

sql 根據日期模糊查詢&SQL Server dateTime型別 模糊查詢

曾經遇到這樣的情況,在資料庫的Meeting表中有PublishTime (DateTime,8)欄位,用來儲存一個開會時間,在存入時由於要指明開會具體時間,故格式為yyyy-mm-dd hh:mm:ss,而我們查詢時是通過yyyy-mm-dd來進行的,即查詢某一天的所有會議資訊,這樣如果通過select * from Meeting where [email protected] (引數@PublishTime為yyyy-mm-dd格式)語句進行查詢將無法得到正確結果,比如我們要查詢2004年12月1日的會議資訊,在輸入2004-12-01時就不能得到查詢結果,而這種查詢又不能要求輸入具體的hh:mm:ss.

此時我們需要使用convert函式,它可以將一種資料型別的表示式轉換為另一種資料型別的表示式.此處我們先將資料庫內的datetime型別轉換為char型別,由於輸入的引數是10位的,所以寫成

select * from Meeting where convert(varchar(10),PublishTime,121))[email protected],這樣在查詢時資料庫得到引數後先自動將資料庫內的資訊轉換為yyyy-mm-dd格式的10位字元,只要與引數相同即可返回查詢結果.而convert中的121是指將datetime型別轉換為char型別時獲得包括世紀位數的4位年份(轉載)

日期格式的like模糊查詢真的好怪

,在一個專案中,我試了很多種查法:

select * from T where sendTime like '%2007_12_%'    可以查詢2007年12月的所有記錄

如果like條件改為'%2007-12-%' ,'%2007_12_3%' ,或'%2007_12_30%' 都查不出資料。還有:

select * from T where sendTime like '%12_30%'    可以查詢12月30日的所有記錄

如果like條件改為'%07_12_30%'  也查不出資料。

一直搞不明白是怎麼回事。不過現在找到了一個很好的解決方法:

將資料庫中的時間欄位格式改為字串格式。

SELECT * FROM T WHERE Convert(varchar

,sendTime,120) LIKE '2007-12-30%'

其中:T為資料庫的表,sendTime是資料庫中的時間欄位的欄位名。這樣就可以查詢2007-12-30的記錄了。

順便把SQL Server中Convert函式的用法貼出來。


CAST 和 CONVERT

將某種資料型別的表示式顯式轉換為另一種資料型別。CAST 和 CONVERT 提供相似的功能。
語法

使用 CAST:CAST ( expression AS data_type )

使用 CONVERT:CONVERT (data_type[(length)], expression [, style])


引數

expression

是任何有效的 Microsoft? SQL Server? 表示式。有關更多資訊,請參見表示式

data_type

目標系統所提供的資料型別,包括 bigint 和 sql_variant。不能使用使用者定義的資料型別。有關可用的資料型別的更多資訊,請參見資料型別

length

nchar、nvarchar、char、varchar、binary 或 varbinary 資料型別的可選引數。

style

日期格式樣式,藉以將 datetime 或 smalldatetime 資料轉換為字元資料(nchar、nvarchar、char、varchar、nchar 或 nvarchar 資料型別);或者字串格式樣式,藉以將 float、real、money 或 smallmoney 資料轉換為字元資料(nchar、nvarchar、char、varchar、nchar 或 nvarchar 資料型別)。

SQL Server 支援使用科威特演算法的阿拉伯樣式中的資料格式。

在表中,左側的兩列表示將 datetime 或 smalldatetime 轉換為字元資料的 style 值。給 style 值加 100,可獲得包括世紀數位的四位年份 (yyyy)。

不帶世紀數位 (yy) 帶世紀數位 (yyyy)
標準

輸入/輸出**
- 0 或 100 (*) 預設值 mon dd yyyy hh:miAM(或 PM)
1 101 美國 mm/dd/yyyy
2 102 ANSI yy.mm.dd
3 103 英國/法國 dd/mm/yy
4 104 德國 dd.mm.yy
5 105 義大利 dd-mm-yy
6 106 - dd mon yy
7 107 - mon dd, yy
8 108 - hh:mm:ss
- 9 或 109 (*) 預設值 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM)
10 110 美國 mm-dd-yy
11 111 日本 yy/mm/dd
12 112 ISO yymmdd
- 13 或 113 (*) 歐洲預設值 + 毫秒 dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)
- 20 或 120 (*) ODBC 規範 yyyy-mm-dd hh:mm:ss[.fff]
- 21 或 121 (*) ODBC 規範(帶毫秒) yyyy-mm-dd hh:mm:ss[.fff]
- 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(不含空格)
- 130* 科威特 dd mon yyyy hh:mi:ss:mmmAM
- 131* 科威特 dd/mm/yy hh:mi:ss:mmmAM

*    預設值(style 0 或 100、9 或 109、13 或 113、20 或 120、21 或 121)始終返回世紀數位 (yyyy)。
** 當轉換為 datetime 時輸入;當轉換為字元資料時輸出。
*** 專門用於 XML。對於從 datetime 或 smalldatetime 到 character 資料的轉換,輸出格式如表中所示。對於從 float、money 或 smallmoney 到 character 資料的轉換,輸出等同於 style 2。對於從 real 到 character 資料的轉換,輸出等同於 style 1。

重要  預設情況下,SQL Server 根據截止年份 2049 解釋兩位數字的年份。即,兩位數字的年份 49 被解釋為 2049,而兩位數字的年份 50 被解釋為 1950。許多客戶端應用程式(例如那些基於 OLE 自動化物件的客戶端應用程式)都使用 2030 作為截止年份。SQL Server 提供一個配置選項("兩位數字的截止年份"),藉以更改 SQL Server 所使用的截止年份並對日期進行一致性處理。然而最安全的辦法是指定四位數字年份。

當從 smalldatetime 轉換為字元資料時,包含秒或毫秒的樣式將在這些位置上顯示零。當從 datetime 或 smalldatetime 值進行轉換時,可以通過使用適當的 char 或 varchar 資料型別長度來截斷不需要的日期部分。

下表顯示了從 float 或 real 轉換為字元資料時的 style 值。

輸出
0(預設值) 最大為 6 位數。根據需要使用科學記數法。
1 始終為 8 位值。始終使用科學記數法。
2 始終為 16 位值。始終使用科學記數法。

在下表中,左列表示從 money 或 smallmoney 轉換為字元資料時的 style 值。

輸出
0(預設值) 小數點左側每三位數字之間不以逗號分隔,小數點右側取兩位數,例如 4235.98。
1 小數點左側每三位數字之間以逗號分隔,小數點右側取兩位數,例如 3,510.92。
2 小數點左側每三位數字之間不以逗號分隔,小數點右側取四位數,例如 4235.9819。


返回型別

返回與 data type 0 相同的值。


註釋

隱性轉換指那些沒有指定 CAST 或 CONVERT 函式的轉換。而顯式轉換指那些已指定了所需 CAST (CONVERT) 函式的轉換。下面的圖表顯示了所有可用於 SQL Server 系統提供的資料型別的顯式和隱性轉換,這些資料型別包括 bigint 和 sql_variant。

說明  因為 Unicode 資料始終使用偶數位位元組,所以當在 binary 或 varbinary 資料型別與 Unicode 所支援的資料型別之間進行轉換時會使用提示。例如,此轉換不返回 41 的十六進位制值,而是返回 4100 的十六進位制值:SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary)

不支援 text 和 image 資料型別的自動資料型別轉換。可以將 text 資料顯式轉換為字元資料,將 image 資料顯性轉換為 binary 或 varbinary 資料,但是最大長度為 8000。如果嘗試進行不正確的轉換(例如,將包含字母的字元表示式轉換為 int),則 SQL Server 會產生錯誤資訊。

當 CAST 或 CONVERT 的輸出是字串並且輸入也是字串時,輸出與輸入具有相同的排序規則和排序規則標籤。如果輸入不是字串,則輸出採用資料庫的預設排序規則及強制預設的排序規則標籤。有關更多資訊,請參見排序規則的優先順序

若要給輸出指派不同的排序規則,請將 COLLATE 子句應用到 CAST 或 CONVERT 函式的結果表示式中。例如:

SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS  

不存在有關賦值的從 sql_variant 資料型別進行的隱性轉換,但是存在轉換為 sql_variant 的隱性轉換。

將字元或二進位制表示式(char、nchar、nvarchar、varchar、binary 或 varbinary)轉換為不同資料型別的表示式時,資料可能會被截斷,只顯示一部分,或者因為結果太短無法顯示而返回錯誤。除下表中所顯示的轉換外,轉換為 char、varchar、nchar、nvarchar、binary 和 varbinary 時將被截斷。

被轉換的資料型別 轉換為的資料型別 結果
int、smallint 或 tinyint char *
varchar *
nchar E
nvarchar E
money、smallmoney、numeric、decimal、float 或 real char E
varchar E
nchar E
nvarchar E

* 結果長度太短而無法顯示。
E 因為結果長度太短無法顯示而返回錯誤。

Microsoft SQL Server 僅保證往返轉換(即,從原始資料型別進行轉換後又返回原始資料型別)在各版本間產生相同值。下面的示例顯示往返轉換:

DECLARE @myval decimal (5, 2)  SET @myval = 193.57  SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5))  -- Or, using CONVERT  SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))  

例如,不要嘗試構造 binary 值並將它們轉換為數字資料型別分類的資料型別。SQL Server 並不保證 decimal 或 numeric 資料型別轉換為 binary 的結果在 SQL Server 各版本間相同。

下面的示例顯示了由於太短而無法顯示的結果表示式。

USE pubs  SELECT SUBSTRING(title, 1, 25) AS Title, CAST(ytd_sales AS char(2))  FROM titles  WHERE type = 'trad_cook'  

下面是結果集:

Title                          ------------------------- --   Onions, Leeks, and Garlic *    Fifty Years in Buckingham *    Sushi, Anyone?            *      (3 row(s) affected)  

當具有不同小數位數的資料型別進行轉換時,值將被截斷為最精確的數位。例如,SELECT CAST(10.6496 AS int) 的結果為 10。

轉換時,若目標資料型別的小數位數小於源資料型別的小數位數,則要轉換的值將被四捨五入。例如,CAST(10.3496847 AS money) 的結果是 $10.3497。

當將非數字型別的 char、nchar、varchar 或 nvarchar 資料轉換為 int、float、numeric 或 decimal 時,SQL Server 將返回錯誤資訊。當將空字串 (" ") 轉換為 numeric 或 decimal 時,SQL Server 也將返回錯誤資訊。


使用二進位制字串資料

當 binary 或 varbinary 資料轉換為字元資料並且在 x 後面指定了奇數位的值時,SQL Server 在 x 後面新增 0(零)以成為偶數位值。

二進位制資料包含從 0 到 9 和從 A 到 F(或從 a 到 f)的字元,每兩個字元為一組。二進位制字串必須以 0x 開頭。例如,若要輸入 FF,請鍵入 0xFF。最大值是一個 8000 位元組的二進位制值,每個位元組的最大值都是 FF。Binary 資料型別不能用於十六進位制資料,而是用於位模式。對於儲存為二進位制資料的十六進位制數字的轉換和計算結果,無法保證其準確性。

當指定 binary 資料型別的長度時,每兩個字元被算作是一個單位長度。長度 10 表示將輸入 10 個雙字元組。

由 0x 表示的空二進位制字串可以儲存為二進位制資料。


示例
A. 同時使用 CAST 和 CONVERT

每個示例都將檢索書名(這些圖書的截止當前銷售額的第一位數字為 3),並將這些圖書的 ytd_sales 轉換為 char(20)。

-- Use CAST.  USE pubs  GO  SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales  FROM titles  WHERE CAST(ytd_sales AS char(20)) LIKE '3%'  GO    -- Use CONVERT.  USE pubs  GO  SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales  FROM titles  WHERE CONVERT(char(20), ytd_sales) LIKE '3%'  GO  

下面是任一查詢的結果集:

Title                          ytd_sales     ------------------------------ -----------   Cooking with Computers: Surrep 3876          Computer Phobic AND Non-Phobic 375           Emotional Security: A New Algo 3336          Onions, Leeks, and Garlic: Coo 375             (4 row(s) affected)  


B. 使用帶有算術運算子的 CAST

下面的示例通過將總的截止當前銷售額 (ytd_sales) 與每本圖書的價格 (price) 相除,進行單獨列計算 (Copies)。在四捨五入到最接近的整數後,此結果將轉換為 int 資料型別。

USE pubs  GO  SELECT CAST(ROUND(ytd_sales/price, 0) AS int) AS 'Copies'  FROM titles  GO  

下面是結果集:

Copies        ------   205           324           6262          205           102           7440          NULL          383           205           NULL          17            187           16            204           418           18            1263          273             (18 row(s) affected)  


C. 使用 CAST 進行串聯

下面的示例使用 CAST 資料型別轉換函式來串聯非字元、非二進位制表示式。

USE pubs  GO  SELECT 'The price is ' + CAST(price AS varchar(12))  FROM titles  WHERE price > 10.00  GO  

下面是結果集:

------------------   The price is 19.99          The price is 11.95          The price is 19.99          The price is 19.99          The price is 22.95          The price is 20.00          The price is 21.59          The price is 10.95          The price is 19.99          The price is 20.95          The price is 11.95          The price is 14.99            (12 row(s) affected)  


D. 使用 CAST 獲得更多易讀文字

下面的示例在選擇列表中使用 CAST 將 title 列轉換為 char(50) 列,這樣結果將更加易讀。

USE pubs  GO  SELECT CAST(title AS char(50)), ytd_sales  FROM titles  WHERE type = 'trad_cook'  GO  

下面是結果集:

                                                       ytd_sales  --------------------------------------------------     ---------  Onions, Leeks, and Garlic: Cooking Secrets of the      375  Fifty Years in Buckingham Palace Kitchens              15096  Sushi, Anyone?                                         4095    (3 row(s) affected)  


E. 使用帶有 LIKE 子句的 CAST

下面的示例將 int 列(ytd_sales 列)轉換為 char(20) 列,以便使用 LIKE 子句。

USE pubs  GO  SELECT title, ytd_sales  FROM titles  WHERE CAST(ytd_sales AS char(20)) LIKE '15%'  
AND type = 'trad_cook'
GO
  

下面是結果集:

title                                                        ytd_sales     ------------------------------------------------------------ -----------   Fifty Years in Buckingham Palace Kitchens                    15096           (1 row(s) affected)

相關推薦

sql 根據日期模糊查詢&SQL Server dateTime型別 模糊查詢

曾經遇到這樣的情況,在資料庫的Meeting表中有PublishTime (DateTime,8)欄位,用來儲存一個開會時間,在存入時由於要指明開會具體時間,故格式為yyyy-mm-dd hh:mm:ss,而我們查詢時是通過yyyy-mm-dd來進行的,即查詢某一天的所有會

SQL根據日期查詢年、月、星期等

DateName(year,GetDate()) as '年',DateName(month,GetDate()) as '月',DateName(day,GetDate()) as '日',DateName(dw,GetDate()) as '星期',DateName(w

SQLDateTime型別 模糊查詢的方式

select * from Tbname where CONVERT(nvarchar(50),AddTime,120) like '%2014-06-12%' select CONVERT(VARCHAR(24),GETDATE(),120)

sql 中count 在innodb 和myisam 表型別查詢快慢

在sql中經常會用到count(*) 或者不常用的count(‘列’),在innodb和myisam 的查詢速度有多大,原理又是什麼? 下面我們首先嘮嘮myisam和innodb主要區別 1).MyISAM是非事務安全型的,而InnoDB是事務安全型的。 2).MyISAM鎖的粒度是表

EF Core For MySql查詢中使用DateTime.Now作為查詢條件的一個小問題

背景 最近一直忙於手上澳洲線上專案的整體遷移和升級的準備工作,導致部落格和公眾號停更。本週終於艱難的完成了任務,藉此機會,總結一下專案中遇到的一些問題。 EF Core一直是我們團隊中中小型專案常用的ORM框架,在使用SQL Server作為持久化倉儲的場景一下,一直表現還中規中矩。但是在本次專案中,專案

Sql Server日期查詢-SQL查詢今天、昨天、7天內、30天

注: SQL查詢某一段的資料用的比較多,本人記性差,就只有轉載一下辣! 今天的所有資料:select * from 表名 where DateDiff(dd,datetime型別欄位,getdate())=0 昨天的所有資料:select * from 表名 where DateDiff(dd,d

sql語句根據日期查詢,本週,本月,本年,今日相關統計

昨天 select * from tb where datediff(day, 時間欄位 ,getdate()) = 1 今天 select * from tb where datediff(day, 時間欄位 ,getdate()) = 0 本週 select * from t

正確認識SQL Server中的模糊查詢LIKE

目錄 SQL Server中的模糊查詢LIKE 在SQL Server中,當我們想實現模糊查詢時,可能我們首先想到的是使用LIKE語句,其次是使用全文搜尋(即Full-Text Search),如下所示是通過LIKE語句對錶Person.Email

SQL SERVER 根據日期自動生成流水號

----函式中不能使用getdate()函式 ----建立得到當前日期的檢視CREATE VIEW v_GetDateASSELECT nowdate=CONVERT(nvarchar(50),GETDATE(),112)--自動生成訂單編號,長度為14,前8位為年月日,後6

SQL Server中的模糊查詢(搜尋時經常使用)

零、碼仙勵志 只有不想做的,沒有做不到的 一、建庫和建表 create database scort use scort create table emp ( empno int primary key, ename nvarchar(10), age int )

理解SQL Server是如何執行查詢的---Joe-T :mvp

執行 -a cnblogs images image sql img rst http http://www.cnblogs.com/Joe-T/ http://rusanu.com/2013/08/01/understanding-how-sql-server-execu

Sql Server參數化查詢之where in和like實現詳解

blog charindex 語句 pan 建議 ack rop for 臨時表 文章導讀 拼SQL實現where in查詢 使用CHARINDEX或like實現where in 參數化 使用exec動態執行SQl實現where in 參數化 為每一個參數生成一個參數

SQL Server 海量數據查詢代碼優化以及建議

觸發 導出 後者 between mem 存儲 ediff 新建 t_sql 1.應盡量避免在 where 子句中對字段進行 null 值推斷,否則將導致引擎放棄使用索引而進 行全表掃描,如: select id from t

sql根據一個表查詢的數據作為條件查詢另一個表

mar 註意 pan color pen market 訂單號 order art 代碼格式如下: select * from BillConsume where obId in (select obId from OpenBills where clearThe

50種方法優化SQL Server數據庫查詢

commit 很多 ltp 內存不足 方式 else 嚴重 詳細 字段 新的關於數據庫的內容。查詢速度慢的原因很多,常見如下幾種: 1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是程序設計的缺陷) 2、I/O吞吐量小,形成了瓶頸效應。 3、沒有創建計算列導致

SQL SERVER DATETIME應用

print flow and .com bold class lin eight spa PRINT ‘上周的第一天:‘+CONVERT(NVARCHAR(20),DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE())-1, 0),120);

sql server添加oracle查詢linkserver

local mts oracle查詢 技術 proc 用戶名 als all acl EXEC master.dbo.sp_addlinkedserver @server = N‘TESTLINK‘, @srvproduct=N‘oracle‘, @provider=N‘O

SQL Server datetime類型轉換超出範圍的報錯

con 範圍 blog 匹配 insert 語句 時間 light 消息 一個很基礎的插入語句: insert into table1 select col1,convert(datetime,col2),convert(datetime,col3),col4,col5

SQL Server CTE 遞歸查詢全解

ont article tsql set ember expr net 如何使用 測試數據 在TSQL腳本中,也能實現遞歸查詢,SQL Server提供CTE(Common Table Expression),只需要編寫少量的代碼,就能實現遞歸查詢,本文詳細介紹CTE遞歸調

[SQL]sql server中如何直接查詢存儲過程EXEC返回的結果集?

arc div lec rom 結果 In varchar SQ type Declare @T Table (iDay VARCHAR(4),iNum DECIMAL(18,2),yuxiang DECIMAL(18,9))