2012-04-19 64 views
8

我是SQL Server的新手。请帮助我在查询中编写以下逻辑。如果SQL查询中的条件

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

回答

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

嘿RobIII,哥们。只是想说,我确实鼓励了你,但降价可能是这篇文章中对话的结果。不要个人承担,我们都可以总是学到一些东西:)只要记住想想你在发布的内容时所说的内容,并考虑如何将其发布给其他人。我和这里的其他人努力使这个友好的社区欢迎所有技能水平并给每个人一个机会。它看起来像你的标记也是答案,所以恭喜,祝你有美好的一天! – mellamokb 2012-04-20 00:08:29

+0

Roblll, 我向你致敬,如果它让你感觉更好,我想说我实现了你的代码,因为它看起来非常有效。当然,我理解它需要一段时间。 :)非常感谢 – user1345260 2012-04-20 00:10:09

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 

这是MS SQL。如果你想做更多的话,那么只需要一个命令/选择,如果你做BEGIN .... END。

+0

时候起支撑MSSQL'WHERE MAILDATE是Tomorrow'或'WHERE MAILDATE是Today'?此外,['is'](http://msdn.microsoft.com/en-us/library/aa933227(v = sql.80).aspx)运算符旨在与'null'进行比较,没有别的。 – RobIII 2012-04-19 23:09:30

+0

@RobIII我刚刚复制了两条语句,没有看到。无论如何,他可以简单的你,我写在if条款相同,它只是相同的 – YvesR 2012-04-19 23:48:10

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

为什么丑陋的铸造来回(与“魔术[风格常量](http://msdn.microsoft.com/ en-us/library/aa226054(v = sql.80).aspx)“(例如'101')代码,任何人都不会记住,varchars是一个字符串中的一个时间值,包括一个空格,如果忘记了,它会打破所有内容。 )如果有日期时间功能? – RobIII 2012-04-19 23:14:21

+0

@RobIII你是对的,它是固定的。我只是提供了另一种方式来做到这一点,但我没有说这是最好的方式。 – Taryn 2012-04-19 23:16:07

+1

我已经删除了我的答案,因为它们现在基本相同。但我会在这里发布演示:http://www.sqlfiddle.com/#!3/96767/1。请注意,您需要'> = 16',否则您将在下午5点开始。 – mellamokb 2012-04-19 23:56:46

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

它并不一定要在一个存储过程。

+3

评论其他人的答案并宣传自己并不是很有帮助或者是面向社区。请不要在将来做这件事。 – mellamokb 2012-04-19 23:10:34

+0

非常有趣,wildplasser。谢谢@mellamokb。 – BoltClock 2012-04-20 12:39:55

1

我不知道确切的MS-syntax-dialect,但我会尝试证明你不需要IF或CASE构造。我以@mellamokb的回复为例。

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

除了你的“'避免case/else'的任务”导致一个where子句需要对每条记录进行几次评估,而我的情况下......可以只评估一次,然后只需要每条记录一个评估。 – RobIII 2012-04-22 00:07:30

1

这里的想法是使用蕴含重写规则:

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

在你的情况

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

相当于

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

而且本身等同于

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

重新写入原来的ELSE子句在自己的权利的IF..THEN语句:

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

相当于(此时omiting的中间步骤)

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

两个表达然后可以以联合正常形式书写(“一系列的ANDs)

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

选择a.name,如果(a.is_active = 'T', '有效', '无效')从一个MYTABLE