从我到目前为止所读到的,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
中的数字存储到HH
,MM
,SS
,因为在sql server之前可能已经使用过2005。
使用sql server 2012.谢谢
答案 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层应该处理的内容,而不是数据层。