2016-02-29 158 views
0

我有一个SQL表,它具有一个记录客户登录和注销时间的列。在注销时间,有时他们会在午夜注销,将计时器设置为“0”而不是像上午12:00。有没有办法让这个0的接受?或更改为12:00 AM?SQL列无法转换日期/时间

这里是我的SQL命令,我使用:

CREATE TABLE LogoutIncidents 
(
    ID INT PRIMARY KEY IDENTITY(1,1), 
    [Name] NVARCHAR(30), 
    [Logout Time] NVARCHAR(30), 
    [LogoutInc] NVARCHAR(30) 
) 

INSERT INTO LogoutIncidents 
    SELECT 
     loginlogout.[Name], loginlogout.[Logout Time], 
     CASE 
      WHEN ABS(DATEDIFF(MINUTE, loginlogout.[Logout Time], Schedules$.StopTime)) BETWEEN 0 AND 4 
       THEN 0 
      WHEN [Logout Time] = 0 
       THEN 0 
      ELSE 1 
     END AS LogoutInc 
    FROM 
     loginlogout 
    JOIN 
     Schedules$ ON loginlogout.[Name] = Schedules$.Name 

错误:

Msg 241, Level 16, State 1, Line 76
Conversion failed when converting date and/or time from character string.

任何帮助表示赞赏一如既往。

+0

它说错误在第76行......哪一行是? –

+0

INSERT INTO LogoutIncidents –

+0

你可以在你的DATEDIFF函数中尝试一些像'ISNULL(NULLIF(loginlogout。[Logout Time],'0'),'00:00:00.000')'类似的东西。 – ZLK

回答

5

几乎有一件事要做:不要在一个字符串(varchar/nvarchar)中存储时间或日期!

改为使用适当的类型,例如timedatetime2(如果注销也有日期组件)。

+0

上载到SQL服务器的数据来自另一个服务器应用程序自动生成的TXT文件。它像这样导入。但是你说要将列类型从nvarchar更改为我试图加载到的表上的时间? “LogoutIncidents” –

+1

是的,更改表格列中的类型,并使用符合条例草案的转换(使用['convert'](https://msdn.microsoft.com/en-us/library/ms187928.aspx)例如,或者如果需要一个特定的标量函数,它可以按你需要的方式工作)。如果可以在插入可能更好的数据(例如,解析文本文件的代码,然后将参数传入日期)之前进行转换。 – Lucero

+0

或者如果更改表模式是禁止的,请添加一个计算列。 – dman2306

0

我没有足够的代表处添加评论,但为什么不先做表的更新与午夜相应的时间,以取代0

例(大概是当天):

UPDATE loginlogout 
SET [Logout Time] = CAST(CONVERT(VARCHAR(10), GETDATE(), 110) AS DATETIME) 
WHERE [Logout Time] = '0'