2012-02-07 359 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

相关问题