在SQL Server中以AM / PM格式在单列中插入两个不同的TIME

时间:2017-11-24 22:21:15

标签: sql sql-server sql-server-2014

我有下表

 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 从字符串转换日期和/或时间时转换失败。 我想以上述格式插入日期和时间。

任何帮助表示赞赏! 提前谢谢!

1 个答案:

答案 0 :(得分:1)

SQL Server's datetime type用于存储“时间点”,即一天一次。

从链接引用:

  

定义一个日期,该日期与基于24小时制的小数秒的时间相结合。

您的代码有多个问题:

  1. 字符串11:00 am-13:00 Pm不是有效的datetime值,这就是您的查询失败的原因。

  2. 由于datetime类型也包含时间,因此'12/10/2017'实际上会保存为12/10/2017 00:00

  3. 所以我猜你当前的桌面设计并不是你真正想要的。

    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