据我目前所读,sql server(从 2008 年开始)中的数据类型 time
应该能够以 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。谢谢
最佳答案
您似乎对内部 格式和显示 格式之间的差异感到困惑。 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
将值作为具有您想要的格式的字符串获取。
关于SQL-Server 时间数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34202223/