SQL-Server时间数据类型

时间:2015-12-10 12:44:10

标签: sql sql-server time sql-server-2012

从我到目前为止所读到的,sql server中的数据类型time(从2008开始)应该能够以HH:MM格式存储时间。然后我自己尝试了以下简单的练习:

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.谢谢

2 个答案:

答案 0 :(得分:4)

评论太长了。

您似乎对内部格式与 display 格式之间的区别感到困惑。 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将值作为字符串获取所需的格式。

答案 1 :(得分:2)

您无法控制数据类型存储的格式。您的时间数据实际上存储为一堆位 - 0和1 - 并且它只是在查询分析器中显示,如10:01:00.00000

如果要以其他格式显示,则必须将其转换为文本数据类型,如varchar,但这通常是您的UI层应该处理的内容,而不是数据层。