2012-02-07 357 views
1

任何人都可以幫助我以下提取的代碼我放在一起。該錯誤似乎在CASE聲明中,但我無法看到THEN之後的所有代碼部分已經單獨測試並正常工作。SQL Server:錯誤將字符串轉換爲smalldatetime?

另外需要注意的是所有日期爲datetime數據類型爲yyyy-mm-dd hh:mm:ss.sss

SELECT 
    TICKET_ID, 
    CAL_CR.a_DayName, 
    CREATED, 
    CAL_CL.a_DayName, 
    CLOSED, 
    CASE 
     WHEN CAL_CR.A_DATE IN ('Saturday','Sunday') AND CLOSED IS NULL THEN (DATEDIFF(WEEKDAY,created, closed)*10*60 - (DATEDIFF(MINUTE,CURRENT_TIMESTAMP,CAST(CAST(CAST(CURRENT_TIMESTAMP AS DATE) AS VARCHAR) + ' 18:00' AS DATETIME)))) 
     WHEN CLOSED IS NULL THEN (DATEDIFF(WEEKDAY,created, closed)*10*60 - (DATEDIFF(MINUTE,CAST(CAST(CAST(CREATED AS DATE) AS VARCHAR) + ' 08:30' AS DATETIME),CREATED)) - (DATEDIFF(MINUTE,CURRENT_TIMESTAMP,CAST(CAST(CAST(CURRENT_TIMESTAMP AS DATE) AS VARCHAR) + ' 18:00' AS DATETIME)))) 
     WHEN CAL_CR.A_DATE IN ('Saturday','Sunday') AND CLOSED IS NOT NULL THEN (DATEDIFF(WEEKDAY,created, closed)*10*60 - (DATEDIFF(MINUTE,CLOSED,CAST(CAST(CAST(CLOSED AS DATE) AS VARCHAR) + ' 18:00' AS DATETIME)))) 
     WHEN CAL_CL.A_DATE IN ('Saturday','Sunday') AND CLOSED IS NOT NULL THEN (DATEDIFF(WEEKDAY,created, closed)*10*60 - (DATEDIFF(MINUTE,CAST(CAST(CAST(CREATED AS DATE) AS VARCHAR) + ' 08:30' AS DATETIME),CREATED))) 
     WHEN (CAL_CR.A_DATE IN ('Saturday','Sunday')) AND (CAL_CL.A_DATE IN ('Saturday','Sunday')) AND CLOSED IS NOT NULL THEN (DATEDIFF(WEEKDAY,created, closed)*10*60) 
     ELSE (DATEDIFF(WEEKDAY,created, closed)*10*60 - (DATEDIFF(MINUTE,CAST(CAST(CAST(CREATED AS DATE) AS VARCHAR) + ' 08:30' AS DATETIME),CREATED)) - (DATEDIFF(MINUTE,CLOSED,CAST(CAST(CAST(CLOSED AS DATE) AS VARCHAR) + ' 18:00' AS DATETIME)))) 
    END AS Open_Minutes 
FROM 
    OST_TICKET 
LEFT JOIN 
    AMI_STATIC.DBO.SB_CALENDAR CAL_CR 
    ON 
     CAL_CR.a_Date = CAST(CREATED AS DATE) 
LEFT JOIN 
    AMI_STATIC.DBO.SB_CALENDAR CAL_CL 
    ON 
     CAL_CL.a_Date = CAST(CLOSED AS DATE) 

提前許多感謝任何幫助都沒有。


感謝民主黨,

採取您的建議和整理的代碼了遠一點。見下圖:

SELECT 
    TICKET_ID, 
    CAL_CR.a_DayName, 
    CREATED, 
    CAL_CL.a_DayName, 
    CLOSED, 
    CASE 
     WHEN CAL_CR.A_DATE IN ('Saturday','Sunday') AND CLOSED IS NULL THEN DATEDIFF(WEEKDAY,created, closed)*10*60 - DATEDIFF(MINUTE,CAST(CURRENT_TIMESTAMP AS TIME),CAST('18:00' AS TIME)) 
     WHEN CLOSED IS NULL THEN DATEDIFF(WEEKDAY,created, closed)*10*60 - DATEDIFF(MINUTE,CAST('08:30' AS TIME),CAST(CREATED AS TIME)) - DATEDIFF(MINUTE,CAST(CURRENT_TIMESTAMP AS TIME),CAST('18:00' AS TIME)) 
     WHEN CAL_CR.A_DATE IN ('Saturday','Sunday') AND CLOSED IS NOT NULL THEN DATEDIFF(WEEKDAY,created, closed)*10*60 - DATEDIFF(MINUTE,CAST(CLOSED AS TIME),CAST('18:00' AS TIME)) 
     WHEN CAL_CL.A_DATE IN ('Saturday','Sunday') AND CLOSED IS NOT NULL THEN DATEDIFF(WEEKDAY,created, closed)*10*60 - DATEDIFF(MINUTE,CAST('08:30' AS TIME),CAST(CREATED AS TIME)) 
     WHEN (CAL_CR.A_DATE IN ('Saturday','Sunday')) AND (CAL_CL.A_DATE IN ('Saturday','Sunday')) AND CLOSED IS NOT NULL THEN DATEDIFF(WEEKDAY,created, closed)*10*60 
     ELSE DATEDIFF(WEEKDAY,created, closed)*10*60 - DATEDIFF(MINUTE,CAST('08:30' AS TIME),CAST(CREATED AS TIME)) - DATEDIFF(MINUTE,CAST(CLOSED AS TIME),CAST('18:00' AS TIME)) 
    END AS Open_Minutes 
FROM 
    OST_TICKET 
LEFT JOIN 
    AMI_STATIC.DBO.SB_CALENDAR CAL_CR 
    ON 
     CAL_CR.a_Date = CAST(CREATED AS DATE) 
LEFT JOIN 
    AMI_STATIC.DBO.SB_CALENDAR CAL_CL 
    ON 
     CAL_CL.a_Date = CAST(CLOSED AS DATE) 

仍然得到同樣的錯誤,但:把字符串爲smalldatetime數據類型時

轉換失敗。

哪個開始有點煩人。

以代碼分開仍然有效,以及

SELECT 
    DATEDIFF(WEEKDAY,created, closed)*10*60 - DATEDIFF(MINUTE,CAST('08:30' AS TIME),CAST(CREATED AS TIME)) - DATEDIFF(MINUTE,CAST(CLOSED AS TIME),CAST('18:00' AS TIME)) 
FROM 
    OST_TICKET 
WHERE 
    TICKET_ID = 30374 

感謝,

馬庫斯

回答

2

你鑄造日期時間爲VARCHAR,然後回到日期時間,比如這裏...
- CAST(CAST(CAST(CURRENT_TIMESTAMP AS DATE) AS VARCHAR) + ' 18:00' AS DATETIME)

至少你需要指定一個大小; VARCHAR(16)而不僅僅是VARCHAR。如果你不這樣做,你實際上最多隻能得到1個字符。但是,如果您將日期和時間轉換爲字符串來操縱它們,那麼您幾乎總是在做一些「錯誤」的事情。我建議更多的東西一樣...
- DATEADD(hour, 18, CAST(CURRENT_TIMESTAMP AS DATE))

+0

民主黨,我不得不添加額外的信息,因此已editted這一問題的主體 – LinkOps 2012-02-07 16:10:29

+0

@linkOps - 您的編輯意味着最後一個SQL實例工作,還是給出同樣的錯誤?此外,你能列出你使用的所有字段的數據類型嗎?或者更重要的是,任何VARCHAR()? – MatBailie 2012-02-07 16:14:55

+0

看起來像是我的錯。當cal_cr/cal_cl.a_date實際上應該是cal_cr/cl.a_dayname時 – LinkOps 2012-02-08 09:24:23

相關問題