SQLSERVER 中datetime 和 smalldatetime類型分析說明
datetime 和 smalldatetime
代表日期和一天內(nèi)的時(shí)間的日期和時(shí)間數(shù)據(jù)類型。
Microsoft SQL Server 用兩個(gè) 4 字節(jié)的整數(shù)內(nèi)部存儲 datetime 數(shù)據(jù)類型的值。第一個(gè) 4 字節(jié)存儲 base date (即 1900 年 1 月 1 日)之前或之后的天數(shù)。基礎(chǔ)日期是系統(tǒng)參考日期。不允許早于 1753 年 1 月 1 日的 datetime 值。第一個(gè)4 字節(jié):1900 年1 月1 日當(dāng)日為0 ;之前的日期是負(fù)數(shù);之后日期是正數(shù)。另外一個(gè) 4 字節(jié)存儲以午夜后3 1/3 毫秒數(shù)所代表的每天的時(shí)間。
smalldatetime 數(shù)據(jù)類型存儲日期和每天的時(shí)間,但精確度低于 datetime 。 SQL Server 將 smalldatetime 的值存儲為兩個(gè) 2 字節(jié)的整數(shù)。第一個(gè) 2 字節(jié)存儲 1900 年 1 月 1 日后的天數(shù)。另外一個(gè) 2 字節(jié)存儲午夜后的分鐘數(shù)。日期范圍從1900 年 1 月 1 日到 2079 年 6 月 6 日,精確到分鐘。
可以將這兩種類型轉(zhuǎn)換成float 浮點(diǎn)數(shù), 其中整數(shù)部分就是對應(yīng)的日期字節(jié), 而小數(shù)部分是時(shí)間相應(yīng)的比例, 如datetime 的小數(shù)部分就是占整天的毫秒數(shù)的比例;smalldatetime 的小數(shù)部分就是占整天的分鐘數(shù)的比例. 因此我們可以直接將這兩種類型的變量和整數(shù)、浮點(diǎn)數(shù)進(jìn)行直接的加減。
datetime
從 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和時(shí)間數(shù)據(jù),精確度為百分之三秒(等于 3.33 毫秒或 0.00333 秒)。如下表所示,把值調(diào)整到 .000 、.003 、或 .007 秒的增量。
| 示例 | 調(diào)整后的示例 |
| 01/01/98 23:59:59.999 | 1998-01-02 00:00:00.000 |
| 01/01/98 23:59:59.995, 01/01/98 23:59:59.996, 01/01/98 23:59:59.997, 或 01/01/98 23:59:59.998 |
1998-01-01 23:59:59.997 |
| 01/01/98 23:59:59.992, 01/01/98 23:59:59.993, 01/01/98 23:59:59.994 |
1998-01-01 23:59:59.993 |
| 01/01/98 23:59:59.990 或 01/01/98 23:59:59.991 |
1998-01-01 23:59:59.990 |
我們常常需要搜索指定日期范圍內(nèi)的數(shù)據(jù), 比如返回1998-01-01 當(dāng)天內(nèi)的數(shù)據(jù), 你可能會這樣寫:
date >= ‘1998-01-01 00:00:00.000' and date <= ‘1998-01-01 23:59:59.999 '
根據(jù)上面的調(diào)整規(guī)則, 其實(shí)這句語句的實(shí)際搜索范圍為:
date >= ‘1998-01-01 00:00:00.000' and date <= ‘1998-01-02 00:00:00.000 '
你會看到這包括了1998-01-02 的數(shù)據(jù), 所以最好的正確的搜索語句為:
date >= ‘1998-01-01 00:00:00.000' and date < ‘1998-01-02 00:00:00.000 '
smalldatetime
從 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和時(shí)間數(shù)據(jù)精確到分鐘。29.998 秒或更低的 smalldatetime 值向下舍入為最接近的分鐘,29.999 秒或更高的 smalldatetime 值向上舍入為最接近的分鐘。
--returns time as 12:35
SELECT CAST('2000-05-08 12:35:29.998' AS smalldatetime)
GO
--returns time as 12:36
SELECT CAST('2000-05-08 12:35:29.999' AS smalldatetime)
GO
賦值:
上面說了時(shí)間的實(shí)際格式,我們在給一個(gè)時(shí)間變量賦值時(shí)肯定不會賦一個(gè)浮點(diǎn)數(shù)給該變量,更多的情況是我們給這個(gè)變量賦一個(gè)字符串,系統(tǒng)會自動將字符串變成時(shí)間格式并保存到數(shù)據(jù)庫中。若字符格式錯(cuò)誤,則報(bào)錯(cuò)。根據(jù)語言不同,世界上有多種不同的用字符串表示時(shí)間方式,我們可以通過 sp_helplanguage 查看不同語言下的缺省時(shí)間格式,如簡體中文的時(shí)間格式為 ymd ,可以通過 SET DATEFORMAT 來暫時(shí)更改這個(gè)缺省值。
時(shí)間函數(shù)
DATEADD :可以對時(shí)間類型的指定部分進(jìn)行加減計(jì)算,雖然我們上面說了可以進(jìn)行直接的加減,但是我們可以更方便的利用這個(gè)函數(shù)對指定部分,如年月日時(shí)分秒等進(jìn)行加減。我們常常根據(jù)一個(gè)時(shí)間來構(gòu)造出另外一個(gè)時(shí)間,比如下個(gè)月的今天 , 本月底等等,我們應(yīng)該也盡量使用 DATEADD 函數(shù)來構(gòu)造,它可以避免一些閏月、年底、月底之類的錯(cuò)誤,我以前就是根據(jù) DATENAME 來構(gòu)造的,常常要考慮這些問題。
DATEDIFF :該函數(shù)對兩個(gè)時(shí)間變量對指定部分進(jìn)行比較計(jì)算。此函數(shù)不考慮比指定日期部分更高的粒度級別,它只考慮更低級別的部分。對時(shí)間的比較應(yīng)盡量使用本函數(shù)。
舉個(gè)出錯(cuò)的例子:返回兩個(gè)時(shí)間變量的小時(shí)差。若使用 DATEPART(HOUR, @T2 - @T1) 就可能會出錯(cuò);你應(yīng)該使用 DATEDIFF(HOUR, @T1, @T2) 。
DATEPART :返回時(shí)間變量的指定部分的值。
DATENAME :返回時(shí)間變量的指定部分的值,和 DATAPART 不同的是本函數(shù)返回的是個(gè)字符串類型
GETDATE() 返回本機(jī)器的當(dāng)前時(shí)間。 CURRENT_TIMESTAMP 變量與本函數(shù)功能相同。
GETUTCDATE() 返回本機(jī)器的當(dāng)前 UTC (格林尼治標(biāo)準(zhǔn)時(shí)間)時(shí)間。
相關(guān)文章
SQL?Server數(shù)據(jù)庫連接查詢和子查詢實(shí)戰(zhàn)案例
子查詢(嵌套查詢)子查詢也稱嵌套查詢,是指一個(gè)SELECT查詢語句可以嵌入另一個(gè)SELECT查詢語句之中,下面這篇文章主要給大家介紹了關(guān)于SQL?Server數(shù)據(jù)庫連接查詢和子查詢的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
SQL Server實(shí)現(xiàn)將特定字符串拆分并進(jìn)行插入操作的方法
這篇文章主要介紹了SQL Server實(shí)現(xiàn)將特定字符串拆分并進(jìn)行插入操作的方法,涉及SQL Server的循環(huán)、遍歷、判定及插入等相關(guān)操作技巧,需要的朋友可以參考下2016-08-08
Navicat 連接SQLServer數(shù)據(jù)庫(圖文步驟)
這篇文章主要介紹了Navicat 連接SQLServer數(shù)據(jù)庫(圖文步驟),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
淺談mssql access數(shù)據(jù)庫 top分頁方法
雙top法相比于not in和max法,就是可以傳入一條sql語句來生成分頁sql語句,也可多字段排序2013-10-10
SQL Server自動更新統(tǒng)計(jì)信息的基本算法
最初接觸SQL Server的時(shí)候認(rèn)為SQLServer數(shù)據(jù)更改的同時(shí)就會相應(yīng)的更新統(tǒng)計(jì)信息,其實(shí)SQL Server不是這樣做的.基于性能考慮,SQL Server使用下面的算法更新統(tǒng)計(jì)信息2012-08-08
基于SQL Server中char,nchar,varchar,nvarchar的使用區(qū)別
對于程序中的一般字符串類型的字段,SQL Server中有char、varchar、nchar、nvarchar四種類型來對應(yīng),那么這四種類型有什么區(qū)別呢,這里做一下對比2013-05-05
使用sqlserver官方驅(qū)動包調(diào)用存儲過程遇到的坑及解決方法
這篇文章主要介紹了用sqlserver官方驅(qū)動包調(diào)用存儲過程遇到的一個(gè)坑,解決方法大概就是換驅(qū)動包,在在存儲過程首行添加 set nocount on ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10
sql?server修改數(shù)據(jù)庫文件位置的詳細(xì)步驟記錄
在SQL?Server中可以通過一系列的步驟來更改數(shù)據(jù)庫文件的存儲位置,這篇文章主要給大家介紹了關(guān)于sql?server修改數(shù)據(jù)庫文件位置的詳細(xì)步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07

