我是SQL Server的新手。请帮助我在查询中编写以下逻辑。如果SQL查询中的条件
If getnow() > today 4 PM
Then
SELECT *
FROM table
WHERE MailDate is Tomorrow
Else
SELECT *
FROM table
WHERE MailDate is Today
我是SQL Server的新手。请帮助我在查询中编写以下逻辑。如果SQL查询中的条件
If getnow() > today 4 PM
Then
SELECT *
FROM table
WHERE MailDate is Tomorrow
Else
SELECT *
FROM table
WHERE MailDate is Today
select *
from table
where DATEDIFF(day, GETDATE(), maildate) = case when
DATEPART(hour, GETDATE()) >= 16 then 1 else 0
end
您需要一个存储过程来在SQL中执行此操作。看看这里的文档http://msdn.microsoft.com/en-us/library/aa174792(v=sql.80).aspx
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。
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
为什么丑陋的铸造来回(与“魔术[风格常量](http://msdn.microsoft.com/ en-us/library/aa226054(v = sql.80).aspx)“(例如'101')代码,任何人都不会记住,varchars是一个字符串中的一个时间值,包括一个空格,如果忘记了,它会打破所有内容。 )如果有日期时间功能? – RobIII 2012-04-19 23:14:21
@RobIII你是对的,它是固定的。我只是提供了另一种方式来做到这一点,但我没有说这是最好的方式。 – Taryn 2012-04-19 23:16:07
我已经删除了我的答案,因为它们现在基本相同。但我会在这里发布演示:http://www.sqlfiddle.com/#!3/96767/1。请注意,您需要'> = 16',否则您将在下午5点开始。 – mellamokb 2012-04-19 23:56:46
我不知道确切的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)
;
除了你的“'避免case/else'的任务”导致一个where子句需要对每条记录进行几次评估,而我的情况下......可以只评估一次,然后只需要每条记录一个评估。 – RobIII 2012-04-22 00:07:30
这里的想法是使用蕴含重写规则:
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))
两个表达然后可以以联合正常形式书写(“一系列的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)) ;
选择a.name,如果(a.is_active = 'T', '有效', '无效')从一个MYTABLE
嘿RobIII,哥们。只是想说,我确实鼓励了你,但降价可能是这篇文章中对话的结果。不要个人承担,我们都可以总是学到一些东西:)只要记住想想你在发布的内容时所说的内容,并考虑如何将其发布给其他人。我和这里的其他人努力使这个友好的社区欢迎所有技能水平并给每个人一个机会。它看起来像你的标记也是答案,所以恭喜,祝你有美好的一天! – mellamokb 2012-04-20 00:08:29
Roblll, 我向你致敬,如果它让你感觉更好,我想说我实现了你的代码,因为它看起来非常有效。当然,我理解它需要一段时间。 :)非常感谢 – user1345260 2012-04-20 00:10:09