2012-04-19 42 views
8

Tôi là người mới sử dụng SQL Server. Xin hãy giúp tôi viết Logic sau đây trong một truy vấn.NẾU Điều kiện trong truy vấn SQL

If getnow() > today 4 PM 
Then 
    SELECT * 
    FROM table 
    WHERE MailDate is Tomorrow 
Else 
    SELECT * 
    FROM table 
    WHERE MailDate is Today 

Trả lời

6
select * 
from table 
where DATEDIFF(day, GETDATE(), maildate) = case when 
    DATEPART(hour, GETDATE()) >= 16 then 1 else 0 
end 
+2

Xin chào RobIII, bạn thân. Chỉ muốn nói, tôi đã upvote bạn, nhưng downvotes có thể là kết quả của các cuộc hội thoại trong bài viết này. Đừng coi đó là cá nhân, tất cả chúng ta đều có thể học được điều gì đó :) Chỉ cần nhớ suy nghĩ về những gì bạn đang nói khi bạn đăng nó và xem xét nó có thể xảy ra với người khác như thế nào. Tôi và những người khác ở đây cố gắng hết sức để biến SO thành một cộng đồng thân thiện chào đón tất cả các cấp độ kỹ năng và mang lại cho mọi người một cơ hội. Có vẻ như máy của bạn cũng đã được đánh dấu là câu trả lời, vì vậy hãy chúc mừng và chúc bạn một ngày tuyệt vời! – mellamokb

+0

Roblll, Tôi upvoted bạn và nếu nó làm cho bạn cảm thấy bất kỳ tốt hơn, tôi muốn nói rằng tôi thực hiện mã của bạn vì nó trông rất hiệu quả. Tất nhiên phải mất một lúc để tôi hiểu nó. :) Cảm ơn rất nhiều – user1345260

0
IF (DATEDIFF(h, GETDATE(), DATEADD(h,4,GETDATE()))>0) 

SELECT * 
FROM table 
WHERE MailDate is Tomorrow 

ELSE 

SELECT * 
FROM table 
WHERE MailDate is Today 

Đây là MS SQL. Nếu bạn muốn làm nhiều hơn thì chỉ cần một lệnh/chọn bên trong nếu bạn thực hiện BEGIN .... END.

+0

Kể từ khi thực hiện hỗ trợ MSSQL 'Ở ĐÂU MailDate là Tomorrow' hoặc 'Ở ĐÂU MailDate là Hôm nay'? Ngoài ra, toán tử ['is'] (http://msdn.microsoft.com/en-us/library/aa933227 (v = sql.80) .aspx) được dùng để so sánh với' null', không có gì khác. – RobIII

+0

@RobIII Tôi vừa sao chép hai câu, không thấy điều đó. Dù sao anh ta có thể đơn giản bạn cùng tôi đã viết trong mệnh đề if, nó chỉ là cùng một – YvesR

3
IF datepart(hh, getdate()) >= 16 
    BEGIN 
     SELECT * 
     FROM table 
     WHERE DateDiff(day, getdate(), MailDate) = 1 
    END 
ELSE 
    BEGIN 
     SELECT * 
     FROM table 
     WHERE DateDiff(day, getdate(), MailDate) = 0 
    END 
+1

Tại sao việc đúc xấu xí trở lại-và-ra (với "ma thuật [phong cách liên tục] (http://msdn.microsoft.com/ vi-us/library/aa226054 (v = sql.80) .aspx) "(ví dụ như' 101') mã không ai có thể nhớ, varchars, một timevalue trong một chuỗi bao gồm một không gian mà, nếu quên, sẽ phá vỡ tất cả mọi thứ vv) nếu có các hàm datetime? – RobIII

+0

@RobIII bạn nói đúng là nó đã được sửa. Tôi chỉ cung cấp một cách khác để làm điều đó nhưng tôi không nói đó là cách tốt nhất. – Taryn

+1

Tôi đã xóa câu trả lời của mình vì chúng bây giờ là cơ bản giống nhau. Nhưng tôi sẽ đăng bản demo ở đây: http://www.sqlfiddle.com/#!3/96767/1. Lưu ý rằng bạn sẽ muốn '> = 16' nếu không bạn sẽ bắt đầu lúc 5 giờ chiều. – mellamokb

0
IF DATEPART(HOUR, GETDATE()) > 16 
BEGIN 
    -- SELECT statement 
END 
ELSE 
BEGIN 
    -- SELECT statement 
END 

Nó không phải là một thủ tục lưu trữ.

+3

Nhận xét về câu trả lời của mọi người và quảng cáo cho riêng bạn không phải là rất hữu ích hoặc hướng đến cộng đồng. Vui lòng không làm điều đó trong tương lai. – mellamokb

+0

Rất hài hước, người thích chơi rượu. Và cảm ơn, @mellamokb. – BoltClock

1

Tôi không biết chính xác cú pháp MS-cú pháp, nhưng tôi sẽ cố chứng minh rằng bạn không cần cấu trúc IF hoặc CASE. Tôi đã trả lời của @mellamokb làm ví dụ.

SELECT * 
    FROM the_table 
WHERE (DATEPART(hour, GETDATE()) >= 16 
      AND DATEDIFF(day, GETDATE(), MailDate) = 1) 
    OR (DATEPART(hour, GETDATE()) < 16 
      AND DATEDIFF(day, GETDATE(), MailDate) = 0) 
    ; 
+0

Trừ trường hợp "tìm kiếm để tránh trường hợp khi có/else'" dẫn đến một mệnh đề 'where' cần một số đánh giá được thực hiện cho mỗi bản ghi trong khi' case when ... 'có thể được đánh giá một lần và sau đó chỉ cần một bản đánh giá cho mỗi bản ghi. – RobIII

1

Ý tưởng ở đây là sử dụng các quy tắc hàm ý viết lại:

IF (x) THEN (y) is equivalent to (NOT (x) OR y) 

Trong trường hợp của bạn

IF (DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16) 
    THEN (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1) 

tương đương với

(NOT (DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16) 
    OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1)) 

và là chính nó tương đương với

((DATEPART(HOUR, CURRENT_TIMESTAMP) < 16) 
    OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1)) 

Re-viết ELSE khoản ban đầu như một tuyên bố IF..THEN theo đúng nghĩa của nó:

IF (DATEPART(HOUR, CURRENT_TIMESTAMP) < 16) 
    THEN (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 0) 

tương đương với (lần này omiting các bước trung gian)

((DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16) 
    OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 0)) 

Khái niệm hai sau đó có thể viết dưới dạng bình thường liên kết ("một loạt các AND s)

SELECT * 
    FROM the_table 
WHERE ((DATEPART(HOUR, CURRENT_TIMESTAMP) < 16) 
      OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1)) 
     AND 
     (((DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16 
      OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 0)) ; 
1

chọn a.name, if (a.is_active = 't', 'Hoạt động', 'Không hoạt động') từ mytable một

Các vấn đề liên quan