我正在开发一个日历应用。它以两种格式存储时间。该表包含以下列title, startDate, startTime
。如果用户提供开始时间加上开始日期。数据库在startTime
列中存储UNIX时间戳(自UNIX epok以来的秒数),而startDate为NULL
。如果用户仅提供开始日期,则数据库将格式nnnn-mm-dd
格式存储在startDate
中,将NULL
格式存储在'startTime`中。我有这种数据库结构,因为它更容易在世界各地显示时间,因为不同的时区有不同的夏令时。
我想选择指定日期之后发生的事件。客户端计算机为服务器提供当天开头的UNIX时间戳($unix
)和格式为$date
的日期(nnnn-mm-dd
)以选择正确的日期。
问题是,我不知道如何选择上面指定的那些日子。此解决方案不适用于我,即使它有效:
SELECT *
FROM events
WHERE startDate >= '$date'
OR startTime >= '$unix'
我在startTime
中提供了unix时间戳的某些行,我还有startDate
中提供的日期以及我不想解释的其他原因。因此,我无法使用上述解决方案。
我需要某种在Where子句中包含IF语句的解决方案,如:
SELECT *
FROM events
WHERE IF(startTime = NULL, startDate >= '$date', startTime >= '$unix')
我只是猜测这个解决方案。但这是对的吗?
答案 0 :(得分:8)
WHERE (startTime IS NULL AND startDate >= '$date')
OR (startTime IS NOT NULL AND startTime >= '$unix')
答案 1 :(得分:4)
所有SQL方言都支持CASE WHEN:
SELECT *
FROM events
WHERE CASE WHEN startTime is null
THEN startDate >= '$date'
ELSE startTime >= '$unix'
答案 2 :(得分:0)
你只需要WHERE
子句中的一些组合布尔逻辑:
SELECT *
FROM events
WHERE
(startDate IS NULL AND startTime >= '$unix') OR
(startTime IS NULL AND startDate >= '$date')
答案 3 :(得分:0)
SELECT *
FROM events
WHERE
(startDate >= '$date' OR startTime >= '$unix')
AND
startDate != NULL
这不会返回任何具有startDate值为空值的行
答案 4 :(得分:0)
我假设你想在startDate不为null时使用startDate,而在startTime不为null时使用startTime ...然后试试这个......
SELECT * FROM events WHERE (startTime is not NULL and startDate >= '$date') OR (startTime is not NULL and startTime >= '$unix')
您也可以使用CASE语句,但这更有意义,更具可读性。
答案 5 :(得分:0)
我知道这是一个老问题,但我认为这是继续进行的最佳方式......
SELECT *
FROM events
WHERE IF(startTime IS NULL, '$date', '$unix') =< startDate