任何人都可以帮助我提供以下代码摘录。该错误似乎出现在CASE
语句中,但是我无法看到THEN之后的所有代码部分单独测试和工作的位置。
另请注意,所有日期均为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)
非常感谢您提供任何帮助。
谢谢Dems,
接受你的建议并进一步整理代码。见下文:
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
谢谢,
马库斯
答案 0 :(得分:3)
您正在将DATETIME投射到VARCHAR,然后再投放到DATETIME,例如此处......
- 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))