2011-07-11 115 views
9

當使用datetime類型在sql server 2008中存儲日期時間值時,它將以什麼格式存儲值?當在sql server(日期時間類型)中存儲日期時間時,它以什麼格式存儲它?

它是自1970年以來的秒數(或其他)?

在應用程序端(.net),我傳入一個日期時間對象。

當我在查詢分析器中查看錶格的行時,它會根據我的文化設置對其進行格式化還是我正在查看存儲在數據庫中的確切內容?

+0

不是一個答案,而是一般小費。以二進制格式進行投射將有助於診斷這種和其他人(unicode)的好奇心。選擇cast(getdate()爲二進制); –

回答

13

內部,根據SQLDenis,它們被存儲爲兩個整數
http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/how-are-dates-stored-in-sql-server

當你在你看到的評估號碼查詢分析器查看。

這是存儲爲 「UNIX時間」
http://en.wikipedia.org/wiki/Unix_time

+0

+1我一直想知道他們是否是浮點數,指數用於什麼,以及精度是否會進一步下降到未來:)感謝您解決這個問題。 – Andomar

+0

正確,很高興我寫的帖子可以幫助某人:-) – SQLMenace

+0

@SQLMenace當SO推介進來或剛剛讀到這個問題時,你有沒有通知? :D – Matthew

6

它存儲爲代表自1月1日天浮點,1900年如果你舍下來通過其鑄造爲int,即只留下日期部分:

select cast(cast(getdate() as int) as datetime) 
--> 
2011-07-12 00:00:00.000 

或者,如果你添加了一些對此,這是增加了幾天。例如,添加0.5相當於添加12小時:

select getdate() + 0.5 
--> 
2011-07-12 11:22:09.927 

詳見本MSDN article

日期時間不包含格式信息;查詢分析器可以以任何喜歡的方式顯示它。它可能會嘗試尊重您的客戶端PC的區域設置。

+2

+1它們可能會被當作浮點數並在SQL中操作,就像它們是一樣的,但是當它們寫入磁盤時,它們是整數。 – Matthew

+0

他們存儲爲2整數,看到我的帖子在這裏http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/how-are-dates-stored-in-sql-server – SQLMenace

-1
DateTime doj = new DateTime(); 

System.Globalization.CultureInfo c1=new System.Globalization.CultureInfo("en-GB",true); 
doj = DateTime.Parse(Txtdoj.Text.Trim(), c1, System.Globalization.DateTimeStyles.NoCurrentDateDefault); 

使用 ..它

使用查詢,顯示日期時間 選擇轉換(varchar(max), doj,103)as doj from tbl_registration

-1

以下是查看存儲方式的代碼:

DECLARE @now datetime, @bytenow binary(8) 
SELECT @now = getdate() 
SELECT @bytenow = convert(binary(8), @now) 
SELECT @now AS fulldate, @bytenow AS internal, 
     convert(int, substring(@bytenow, 1, 4)) AS days, 
     convert(int, substring(@bytenow, 5, 8)) AS ticks 

這顯示了2個值:

  1. 前4個字節是1900年1月1日以來
  2. 第二4個字節表示天數的數目,因爲午夜其中一個滴答聲數目秒鐘有300個滴答聲。

fulldate    internal   days  ticks 
----------------------- ------------------ ----------- ----------- 
2016-11-07 10:54:13.080 0x0000A6B700B3AFB4 42679  11775924 

參考:Solving the Datetime Mystery看到圖3

+0

那爲什麼要投票呢? –