2011-05-13 210 views
5

我正在开发日历应用程序。它存储两种格式的时间。该表格具有以下列title, startDate, startTime。如果用户提供开始时间加上开始日期。数据库在startTime列中存储UNIX时间戳(自UNIX epok以来的秒数),而startDate是NULL。如果用户仅提供开始日期,则数据库以nnnn-mm-dd的格式在'startTime`中以startDateNULL存储日期。我有这个数据库结构,因为在世界各地显示时间更容易,因为不同的时区有不同的夏令时。SQL语句中的Where语句中的IF语句

我想选择指定日期之后发生的事件。客户端计算机为服务器提供当天开始的UNIX时间戳($unix)和格式为nnnn-mm-dd的日期($date)以选择正确的日期。

问题是,我不知道如何选择那些如上所述发生的日子。这种解决方案并不适用于我,即使它的工作原理:

SELECT * 
    FROM events 
WHERE startDate >= '$date' 
    OR startTime >= '$unix' 

的事情是我有一些行,其中UNIX时间戳在startTime提供,我也有startDate提供的日期和其他原因,我我不想解释。正因为如此,我无法使用上面的解决方案。

我需要某种形式的解决方案,它有一个IF语句中Where子句,如:

SELECT * 
    FROM events 
WHERE IF(startTime = NULL, startDate >= '$date', startTime >= '$unix') 

我只是猜测这个解决方案。但是,对吗?

回答

8
WHERE (startTime IS NULL AND startDate >= '$date') 
    OR (startTime IS NOT NULL AND startTime >= '$unix') 
+0

为什么两个'NULL NULL'? – einstein 2011-05-13 04:32:25

+4

@ Woho87:你永远不会有足够的NULL! ;) – 2011-05-13 04:35:21

+0

@ Woho87:没有两个空值。在第一次修订中,但我在10秒后修复了错字。 – zerkms 2011-05-13 04:35:54

0

你只需要一些合并布尔逻辑WHERE子句中:

SELECT * 
FROM events 
WHERE 
    (startDate IS NULL AND startTime >= '$unix') OR 
    (startTime IS NULL AND startDate >= '$date') 
+0

你确定我们在两种情况下都需要'IS NULL'吗?如果是这样 - 为什么不把它移出括号。 – zerkms 2011-05-13 04:37:08

+0

@zerkms:不同的变量......我按照我对海报要求的解释来做,这些要求可能正确也可能不正确:“数据库”在startTime列中存储UNIX时间戳(自UNIX epok以来的秒数)而startDate是NULL。如果用户仅提供开始日期,则数据库以startDate格式存储日期格式为nnnn-mm-dd,在'startTime'中以NULL格式存储日期。 – 2011-05-13 04:38:20

+0

呵呵,我试着根据他的'IF'假设来写我的答案......它代表不同的逻辑:-S – zerkms 2011-05-13 04:41:12

4

所有SQL方言支持CASE WHEN:

SELECT * 
FROM events 
WHERE CASE WHEN startTime is null 
      THEN startDate >= '$date' 
      ELSE startTime >= '$unix' 
+0

这不会被优化为使用索引。 – zerkms 2011-05-13 04:31:59

0
SELECT * 
FROM events 
WHERE 
    (startDate >= '$date' OR startTime >= '$unix') 
AND 
    startDate != NULL 

这将不返回任何一行对于startDate具有空值

+2

'!= NULL'总是被评估为'FALSE' – zerkms 2011-05-13 04:34:57

+1

'AND startDate IS NOT NULL'就是你在那里寻找@Ibu。 – phpguru 2014-05-21 14:36:14

0

我假设你想使用的startDate时的startDate不为空,并开始时间时,开始时间是不是空...那就试试这个...

 

SELECT * 
FROM events 
WHERE (startTime is not NULL and startDate >= '$date') 
OR (startTime is not NULL and startTime >= '$unix') 

您还可以使用CASE语句,但这更有意义的是更具可读性。

0

我知道这是一个老问题,但我认为这是前进的最好方式......

SELECT * 
FROM events 
WHERE IF(startTime IS NULL, '$date', '$unix') =< startDate