我有下表
E(E_id(pk),
E_date (datetime),
E_time (datetime)
,E_Title (varchar (50))
我正在尝试使用以下代码在上表中插入DATE和TIME:
INSERT INTO E(E_Date,E_Title,E_Time)
VALUES('12/10/2017','Every day is a Big day','11:00 am-13:00 Pm')
我执行了上面的代码,但是SQL给了我一个ERROR Saying 从字符串转换日期和/或时间时转换失败。 我想以上述格式插入日期和时间。
任何帮助表示赞赏! 提前谢谢!
答案 0 :(得分:1)
SQL Server's datetime
type用于存储“时间点”,即一天一次。
从链接引用:
定义一个日期,该日期与基于24小时制的小数秒的时间相结合。
您的代码有多个问题:
字符串11:00 am-13:00 Pm
不是有效的datetime
值,这就是您的查询失败的原因。
由于datetime
类型也包含时间,因此'12/10/2017'
实际上会保存为12/10/2017 00:00
。
所以我猜你当前的桌面设计并不是你真正想要的。
SQL中没有类型可以保持“时间跨度”,如上午11点至晚上13点。
由于datetime
实际上是“时间点”,因此最好使用两个日期时间列,一个用于开始,一个用于时间跨度。
当您插入表格时,为两列指定日期和时间。
然后,您可以使用(例如)DATEDIFF
function来计算两个日期时间之间的时间跨度。
这是一个完整的例子:
CREATE TABLE [dbo].[E](
[E_id] [int] IDENTITY(1,1) NOT NULL,
[E_start] [datetime] NULL,
[E_end] [datetime] NULL
) ON [PRIMARY]
GO
insert into E (E_start, E_end)
values
('2017-12-10T11:00:00', '2017-12-10T13:00:00'), -- starts and ends on the same day
('2017-12-10T09:00:00', '2017-12-11T10:00:00') -- starts and ends on different days
select *, DATEDIFF(hh, e_start, e_end) as HoursPassed from e
上次查询的结果:
E_id E_start E_end HoursPassed
----------- ----------------------- ----------------------- -----------
1 2017-12-10 11:00:00.000 2017-12-10 13:00:00.000 2
2 2017-12-10 09:00:00.000 2017-12-11 10:00:00.000 25
(2 rows affected)
要编写一个显示11:00
时间的查询,如果您只想要时间,可以使用CONVERT
:
select convert(char(5), e_start, 108) from E
...或FORMAT
:
select format(e_start, N'hh\:mm') from E