2012-05-01 48 views
1

我需要在两个日期之间进行查询,这很容易,但是如何选择,例如date_end是:0000-00-00(表示无结束) 类似在两个日期内选择,其中第二个未定义

SELECT COUNT(*) FROM news WHERE NOW() BETWEEN data_start 
/* and if data_end > 0000-00-00 */ AND data_end 

谢谢。

+0

不要在日期数据类型中使用BETWEEN。使用'x> = start AND x MatBailie

回答

2

为什么你只是做:

SELECT COUNT(*) FROM news 
WHERE data_start <= NOW() AND (data_end >=NOW() OR data_end ='0000-00-00') 
1

你接近:

SELECT COUNT(*) FROM news 
WHERE 
    data_start<=NOW() 
    AND (data_end='0000-00-00' OR data_end>=NOW()) 
+0

是的,认为你是对的,它是正确,谢谢大家帮助我 –

0

这应该工作,虽然你可能要检查你的服务器上的日期格式:

SELECT COUNT(*) FROM news WHERE NOW() BETWEEN data_start AND IsNull(data_end, cast('1/1/9999' as datetime)) 
2

而不是使用0000-00-00表示没有结束日期,您应该使该字段可以为空,并将值设置为t NULL。这比将end_date设置为早期值更合乎逻辑。

就因为没有news记录将结束于0000-00-00并不能正确地将其用作“无结束”值。例如,如果将来您需要计算新闻的平均日期范围,则使用0000-00-00会扭曲您的结果。

你可以做更新所有当前记录:

UPDATE news 
SET end_date=NULL 
WHERE end_date='0000-00-00' 

然后你可以运行类似的查询:

SELECT COUNT(*) 
FROM news 
WHERE NOW()>=date_start 
AND (NOW()<date_end OR date_end IS NULL) 

如果你没有改变这一点,那么@Arion's answer的能力是一个很好的“hack fix

+0

+1:或者用日期来表示“永恒”,比如“9999-12-31'',或者任何特定数据类型/ RDBMS的最大日期。这样就不需要额外的逻辑了。 * [在start_date值中允许使用“epcoh”而不是NULL的最小日期。] * – MatBailie

+0

@Dems我仍然会将此举分类为不良做法,因为“日期范围”值会出现偏差。看我的编辑。 – Curt

+0

这是有争议的,并取决于所述的功能和要求。我的意思是,如果结束日期为NULL,则日期范围的“真实持续时间”是无穷大,这将以任何方式平均偏移任何平均值。 * [对于无限,实际上。] * – MatBailie

相关问题