2016-02-29 91 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'