(續前)SQLServer常見問題應對
來源:互聯網
上載者:User
server|sqlserver|問題
(續前)SQLServer常見問題應對
著作權©ashuixu轉載請保持完整並註明出處
SQL語句部分
5、“令人頭疼”的日期處理
問題:你是否也有過面對日期處理時的彷徨無措嗎?
解答:你是否瞭解以下事實(摘選自SQLServer2000線上說明-datetime 資料類型:概述):
A.日期的儲存。
datetime
從 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和時間資料,精確度為百分之三秒(等於 3.33 毫秒或 0.00333 秒)。如下表所示,把值調整到 .000、.003、或 .007 秒的增量。
smalldatetime
從 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和時間資料精確到分鐘。29.998 秒或更低的 smalldatetime 值向下舍入為最接近的分鐘,29.999 秒或更高的 smalldatetime 值向上舍入為最接近的分鐘。
Microsoft SQL Server 用兩個 4 位元組的整數內部儲存 datetime 資料類型的值。第一個 4 位元組儲存 base date(即 1900 年 1 月 1 日)之前或之後的天數。基礎日期是系統參考日期。不允許早於 1753 年 1 月 1 日的 datetime 值。另外一個 4 位元組儲存以午夜後毫秒數所代表的每天的時間。
smalldatetime 資料類型儲存日期和每天的時間,但精確度低於 datetime。SQL Server 將 smalldatetime 的值儲存為兩個 2 位元組的整數。第一個 2 位元組儲存 1900 年 1 月 1 日後的天數。另外一個 2 位元組儲存午夜後的分鐘數。日期範圍從1900 年 1 月 1 日到 2079 年 6 月 6 日,精確到分鐘。
B.沒有只儲存時間或日期的獨立的時間和日期資料類型。當設定 datetime 或 smalldatetime 值時,如果只指定時間,則日期預設為 1900 年 1 月 1 日。如果只指定日期,則時間預設為 12:00 AM(午夜)。
C.下面是一些使用日期和時間資料的準則:
· 若要對日期和時間進行精確搜尋匹配,請使用等號(=)。Microsoft SQL Server 以 12:00:00:000 AM(預設值)的精確時間形式返回年、月、日都完全符合的日期和時間值。
· 若要搜尋日期或時間的一部分,請使用 LIKE 運算子。SQL Server 首先把資料轉換為 datetime 格式然後再轉換為 varchar 格式。由於標準時間顯示格式不包括秒和毫秒,不能使用 LIKE 和匹配模式對其搜尋,除非使用 CONVERT 函數並把 style 參數設為 9 或 109。有關部分日期和時間搜尋的更多資訊,請參見 LIKE。
· SQL Server 在運行時計算 datetime 常量。用於某種語言期望的日期格式的日期文字,如果由使用不同語言和日期格式設定的串連來執行查詢,則可能無法識別。例如,下面的視圖對於語言設定為美國英語的串連可以工作正常,但對於其它語言設定的串連就不能工作正常:
CREATE VIEW USA_Dates AS
SELECT *
FROM Northwind.dbo.Orders
WHERE OrderDate < 'May 1, 1997'
當在查詢中使用 datetime 常量,而且該查詢由使用不同語言設定的串連執行時,需確保日期對於所有語言設定均是可以接受的。對於國際資料庫中永久對象中的 datetime 常量,比如資料表條件約束和查看 WHERE 子句,必須同樣小心。有關所有語言設定都解釋為相同的日期格式的更多資訊,請參見編寫國際 Transact-SQL 陳述式。
SQL Server 可以識別以下列格式括在單引號 (') 中的日期和時間:
· 字母日期格式(例如,'April 15, 1998')
· 數字日期格式(例如,'4/15/1998'、'April 15,1998')
· 未分隔的字串格式(例如'19981207'、'December 12, 1998')
6、設計期無法確定的SQL語句
問題:在寫預存程序時,有些SQL語句在設計期是不確定的,這樣的SQL語句怎麼寫呢?
解答:用系統預存程序sp_executesql。
7、常用且重要函數、關鍵字和子句
A.CASE - 計算條件列表並返回多個可能結果運算式之一
B.ISNULL - 使用指定的替換值替換 NULL
C.HAVING 子句 - 指定組或彙總的搜尋條件。HAVING 通常與 GROUP BY 子句一起使用。如果不使用 GROUP BY 子句,HAVING 的行為與 WHERE 子句一樣。