2013-08-01 35 views
11

Tôi đang cố gắng làm cho mã bên dưới hoạt động, riêng hai đoạn mã (trong phần WHEN và công việc ELSE) nhưng được sử dụng trong CASE này tuyên bố Tôi gặp lỗiSQL, cú pháp không chính xác trên báo cáo CASE gần từ khóa 'FROM'

"Cú pháp không đúng gần 'CAST', được mong đợi 'AS'." lỗi.

Về cơ bản nếu mã WHEN báo cáo là bằng hoặc lớn hơn 24 thì sử dụng câu lệnh THEN nếu nó là dưới 24 sau đó sử dụng câu lệnh ELSE.

Tôi dường như không thể làm việc này sau khi thử vài giờ bất kỳ dấu hiệu nào về việc tôi sẽ sai ở đâu sẽ được đánh giá cao.

SELECT CASE 
     WHEN 
      (convert(float,datediff(mi, start_work, end_work))/60) >= '24' 
     THEN 
      (convert(float,datediff(mi, start_work, end_work))/60) 
     ELSE 
      (CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 
      * 60 + RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114), 
      CASE WHEN CHARINDEX(':',convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0 
      THEN LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))-3 
      ELSE LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) 
      END) AS decimal)/60 
FROM NDB.dbo.statusa 
INNER JOIN NDB.dbo.details ON statusa.vkey = details.vkey 
INNER JOIN NDB.dbo.chegu ON statusa.ckey = NDB.dbo.chegu.gkey 
WHERE start_time!= end_time AND string1 = Visit_Id and NDB.dbo.chegu.name = 'loft' 
    AS [Working] 
+0

(chuyển đổi (float, dateiff (mi, start_work, end_work))/60)> = '24' không nên có dấu ngoặc kép khoảng 24. –

Trả lời

14

bạn cần phải đóng tuyên bố case bạn

case when ... then ... else ... end 
10

Nên có một END trước mệnh đề FROM và bạn cũng nên loại bỏ ( trước CAST.

2

Các RIGHT() chức năng không có một tham số thứ hai

RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114), 

hoặc: bạn bỏ lỡ ngoặc kết thúc đằng sau AS thập phân

END) AS decimal))/60 
5

Có arent ngoặc đóng.

SELECT CASE 
    WHEN 
     (convert(float,datediff(mi, start_work, end_work))/60) >= '24' 
    THEN 
     (convert(float,datediff(mi, start_work, end_work))/60) 
    ELSE 
     (CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 
     * 60 + RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114), 
     CASE WHEN CHARINDEX(':',convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0 
     THEN LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))-3 
     ELSE LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) 
     END) AS decimal)/60) 
5

Dấu ngoặc đơn và tuyên bố trường hợp cần có END.

SELECT CASE 
      WHEN (convert(FLOAT, datediff(mi, start_work, end_work))/60) >= '24' 
       THEN (convert(FLOAT, datediff(mi, start_work, end_work))/60) 
      ELSE CAST(convert(VARCHAR(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) * 60 
       + RIGHT(
         convert(VARCHAR(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114), 
         CASE 
          WHEN CHARINDEX(':', convert(VARCHAR(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0 
           THEN LEN(convert(VARCHAR(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) - 3 
          ELSE LEN(convert(VARCHAR(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) 
         END 
         ) AS DECIMAL)/60 
     END 

FROM NDB.dbo.statusa 
INNER JOIN NDB.dbo.details 
    ON statusa.vkey = details.vkey 
INNER JOIN NDB.dbo.chegu 
    ON statusa.ckey = NDB.dbo.chegu.gkey 
WHERE start_time != end_time 
    AND string1 = Visit_Id 
    AND NDB.dbo.chegu.NAME = 'loft' AS [Working] 
4

Hai công thức cơ bản cho biểu TRƯỜNG HỢP 1) trường hợp đơn giản biểu thức Một biểu thức CASE đơn giản kiểm tra một biểu thức chống lại nhiều giá trị. Trong một câu lệnh SELECT, một biểu thức CASE đơn giản chỉ cho phép kiểm tra bình đẳng; không có sự so sánh nào khác được thực hiện. Một biểu thức CASE đơn giản hoạt động bằng cách so sánh biểu thức đầu tiên với biểu thức trong mỗi mệnh đề WHEN cho tương đương. Nếu các biểu thức này là tương đương, thì biểu thức trong mệnh đề THEN sẽ được trả về.

2) Biểu thức CASE được tìm kiếm Biểu thức CASE được tìm kiếm cho phép toán tử so sánh và sử dụng AND và/hoặc OR giữa mỗi biểu thức Boolean. Biểu thức CASE đơn giản chỉ kiểm tra các giá trị tương đương và không thể chứa các biểu thức Boolean. Cú pháp cơ bản cho một biểu TRƯỜNG HỢP đã tìm kiếm được hiển thị dưới đây:

đọc thêm ở đây: http://blog.sqlauthority.com/2007/04/14/sql-server-case-statementexpression-examples-and-explanation/

2

Dưới đây là phiên bản chỉnh sửa của mã của bạn:

SELECT CASE 
     WHEN 
      (convert(float,datediff(mi, start_work, end_work))/60) >= '24' 
     THEN 
      (convert(float,datediff(mi, start_work, end_work))/60) 
     ELSE 
      (CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 
      * 60 + RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114), 
      CASE WHEN CHARINDEX(':',convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0 
      THEN LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))-3 
      ELSE LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) 
      END) AS decimal)/60 
     END 
AS [Working] 
FROM NDB.dbo.statusa INNER JOIN NDB.dbo.details ON statusa.vkey = details.vkey INNER JOIN NDB.dbo.chegu ON statusa.ckey = NDB.dbo.chegu.gkey WHERE start_time!= end_time AND string1 = Visit_Id and NDB.dbo.chegu.name = 'loft' 

Về cơ bản, bạn đã có một END mất tích trong ngoài Câu lệnh SELECT..CASE và bí danh cột đã chọn [Working] được đặt nhầm ở cuối truy vấn chứ không phải trong mệnh đề select của truy vấn.

4

Có 2 lỗi trong mã.
Đầu tiên, bạn có thêm dấu ngoặc đơn ở phía trước CAST không cần thiết (và không được đóng bao giờ). Thay đổi

(CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 

để

CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 

Thứ hai: Thêm END tại kết thúc câu lệnh CASE trước FROM từ khóa (như @gefei chỉ ra ở trên cũng). Mã cuối cùng của bạn sẽ trông giống như sau:

SELECT CASE 
     WHEN 
      (convert(float,datediff(mi, start_work, end_work))/60) >= '24' 
     THEN 
      (convert(float,datediff(mi, start_work, end_work))/60) 
     ELSE 
      CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 
      * 60 + RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114), 
      CASE WHEN CHARINDEX(':',convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0 
      THEN LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))-3 
      ELSE LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) 
      END) AS decimal)/60 
     END 
FROM NDB.dbo.statusa 
INNER JOIN NDB.dbo.details ON statusa.vkey = details.vkey 
INNER JOIN NDB.dbo.chegu ON statusa.ckey = NDB.dbo.chegu.gkey 
WHERE start_time!= end_time AND string1 = Visit_Id and NDB.dbo.chegu.name = 'loft' 
    AS [Working] 
5

Tôi nhận ra câu trả lời này đã quá muộn cho phần thưởng. Nhưng kịch bản của bạn là WAY quá dài. Điều này sẽ làm chính xác giống như bạn đang cố gắng đạt được, sửa lỗi trong mã của bạn, chỉ cần vá mã lỗi:

SELECT 
    datediff(mi, 0, end_time - start_time)/60.0%24 
FROM 
.... 
Các vấn đề liên quan