(續前) SQLServer 常見問題應對 版權所有 ashuixu 轉載請保持完整并注明出處 SQL語句部分 5、令人頭疼的日期處理 問題: 你是否也有過面對日期處理時的彷徨無措么? 解答" name="description" />
MILY: 宋體; mso-bidi-font-size: 10.0pt; mso-hansi-font-family: "Times New Roman"">(續前)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 日)之前或之后的天數?;A日期是系統參考日期。不允許早于 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 子句一樣。