2015-12-10 87 views
1

從我至今讀,在SQL Server(從2008)的數據類型time應該能夠在時間存儲在HH:MM格式。然後,我這跟下面的簡單練習試着自己:SQL-服務器時間數據類型

create table #mytable (id int, lat float, lon float, trajectory_id int, theTime time(5)) 
insert into #mytable values 
('1','15.8','17.1','162','10:01'), 
('2','11.5','59.7','162','10:02'), 
('3','16.4','79.9','162','10:03'), 
('4','29.5','10.3','180','11:12'), 
('5','58.2','11.1','180','11:13'), 
('6','54.5','14.1','180','11:14'), 
('7','14.9','15.2','166','13:40'), 
('8','15.0','13.1','166','13:42') 

我對列theTime預期的結果是:

theTime 
10:01 
10:02 
10:03 
11:12 
11:13 
11:14 
13:40 
13:42 

什麼我的卻是:

theTime 
10:01:00.00000 
10:02:00.00000 
10:03:00.00000 
11:12:00.00000 
11:13:00.00000 
11:14:00.00000 
13:40:00.00000 
13:42:00.00000 

當然,我可以選擇left(theTime, 5)並獲得預期結果。但我想知道如何直接插入它所需的格式。

我想用一個內置的功能,而不是數字在int存儲HHMMSS作爲一個可能的SQL Server 2005

之前已經使用使用SQL Server 2012感謝

+1

如果您將字段類型定義爲TIME(0),則會將數據存儲爲HH:MM:SS。 TIME支持0到7,它設置秒的小數部分的精度。不幸的是,你不能存儲沒有秒的時間。您將需要在表示層重新格式化數據。 https://msdn.microsoft.com/en-GB/library/bb677243.aspx –

回答

3

這是一個評論太長。

你似乎被差內部格式和顯示格式之間的混淆。 TIME是內置於該語言中的數據類型。打印出來時,會打印出小時,分鐘和秒鐘。這就是數據類型打印的方式,與SQL Server不以大於1000的整數放置逗號相同,併爲小數位使用適當的符號。 (或就此打印出在基地10而不是二進制格式的整數,因爲他們實際上是存儲。)

當你說TIME(5)你說你想要的精確分數至少5位小數: HH:MM:SS.SSSSS。沒有選項可以從time類型中完全刪除秒。

如果您想以特定格式打印出來,請使用convert(),cast()format()。令人高興的是,cast()工作得很好。對於日期/時間來說,過多的不可思議的數字代碼比日期更適用於日期。

當你做left(thetime, 5)那麼你隱式地將time轉換爲一個字符串,並採取前五個字符。這似乎滿足您的需求。我建議你剛剛建立到表這樣的:

alter table #mytable add thetime_hhmm as (left(thetime, 5)); 

然後你可以使用thetime_hhmm獲得的價值與你想要的格式的字符串。

+0

很好的解釋,謝謝。我現在明白了。也許還有其他像我這樣的新手想知道這個,現在他們可以看到你的答案並學到一些東西。 – CM2K

+0

如果您確實更改了表格,則應將新列作爲計算字段。 –

2

您無法控制數據類型的存儲格式。你的時間的數據實際上是被存儲爲一串比特 - 0和1的 - 這是唯一的存在在查詢分析器顯示10:01:00.00000

如果你想以另一種格式顯示它,那麼你必須將它轉換爲像varchar這樣的文本數據類型,但這通常是你的UI層應該處理的東西,而不是你的數據層。