Sql 在两个日期内选择,其中第二个日期未定义

Sql 在两个日期内选择,其中第二个日期未定义,sql,date,Sql,Date,我需要在两个日期之间进行查询,这很简单,但是如何选择日期(例如,日期结束日期是:0000-00-00)(这意味着没有结束) 差不多 SELECT COUNT(*) FROM news WHERE NOW() BETWEEN data_start /* and if data_end > 0000-00-00 */ AND data_end 谢谢。你为什么可以这样做: SELECT COUNT(*) FROM news WHERE data_start <= NOW() AND

我需要在两个日期之间进行查询,这很简单,但是如何选择日期(例如,日期结束日期是:
0000-00-00
)(这意味着没有结束) 差不多

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

你为什么可以这样做:

SELECT COUNT(*) FROM news 
WHERE data_start <= NOW() AND (data_end >=NOW() OR data_end ='0000-00-00')
从新闻中选择计数(*)
其中data_start=NOW()或data_end='0000-00-00')
为什么您可以这样做:

SELECT COUNT(*) FROM news 
WHERE data_start <= NOW() AND (data_end >=NOW() OR data_end ='0000-00-00')
从新闻中选择计数(*)
其中data_start=NOW()或data_end='0000-00-00')
你很接近:

SELECT COUNT(*) FROM news 
WHERE 
  data_start<=NOW()
  AND (data_end='0000-00-00' OR data_end>=NOW())
从新闻中选择计数(*)
哪里
数据\u start=NOW())
你很接近:

SELECT COUNT(*) FROM news 
WHERE 
  data_start<=NOW()
  AND (data_end='0000-00-00' OR data_end>=NOW())
从新闻中选择计数(*)
哪里
数据\u start=NOW())

虽然您可能希望检查服务器上的日期格式,但这应该是可行的:

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

虽然您可能希望检查服务器上的日期格式,但这应该是可行的:

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

与其使用
0000-00-00
表示无结束日期,不如将此字段设置为空,并将值设置为
NULL
。这比将
end_date
设置为早期值更有逻辑意义

仅仅因为no
news
记录将在
0000-00-00
结束,并不意味着将其用作“no end”值是正确的。例如,如果将来你需要计算出新闻的平均日期范围,那么使用
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)
选择计数(*)
来自新闻
其中NOW()>=开始日期

和(NOW()而不是使用
0000-00-00
表示无结束日期,您应该使此字段为空,并将值设置为
NULL
。这比将
结束日期设置为早期值更有逻辑意义

仅仅因为没有
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)
选择计数(*)
来自新闻
其中NOW()>=开始日期

和(现在()对于日期数据类型,不要使用
BETWEEN
。使用
x>=start和x
。这是因为日期不是离散值,而是连续值。如果要覆盖1月的前三天,则
仅在“2012-01-01”和“2012-01-03”之间的
仅在日期字段不包含时间组件的情况下才起作用。
x>=2012-01-01’和X'2012-01-04’/CODE将始终覆盖整个三天,而不管数据是否精确到一天、小时、分钟或微秒。(也考虑使用NULL来表示没有日期(明确地指出没有日期),或者‘99 99—12 31’,这样您就不需要额外的逻辑)。对于日期数据类型,不要使用
BETWEEN
。使用
x>=start和x
。这是因为日期不是离散值,而是连续值。如果要覆盖1月的前三天,则
仅在“2012-01-01”和“2012-01-03”之间的
仅在日期字段不包含时间组件的情况下才起作用。
x>=2012-0无论数据是否精确到一天、小时、分钟或微秒,都可以覆盖整个三天的时间。(也可以考虑使用NULL来表示没有日期(明确地说没有日期),或者‘99 99—12 31’,这样你就不需要额外的逻辑)+ 1:或者用一个日期来表示“永恒”。,例如
'9999-12-31'
,或者该特定数据类型/RDBMS的最大日期是什么。这样就不需要任何额外的逻辑。[并且在开始日期值中允许“epcoh”而不是NULL的最小日期。]@Dems I仍然将此归类为“日期范围”的不良做法值将被扭曲。请参阅我的编辑。这是有争议的,取决于所述的功能和要求。我的意思是,如果结束日期为空,则日期范围的“真实持续时间”为无穷大,这将以任何方式扭曲任何平均值。[事实上,这是有限的。]@是的,我想这取决于单个功能。+1:或者使用日期表示“永恒”,例如
'9999-12-31'
,或者特定数据类型/RDBMS的最大日期。这样就不需要任何额外的逻辑。[以及“epcoh”允许的最小日期]开始日期值中没有空值。]@Dems我仍然认为这是一种不好的做法,因为“日期范围”值会有偏差。请参阅我的编辑。这是有争议的,取决于声明的功能和要求。我的意思是,如果结束日期为空,则“真实持续时间”日期范围的最大值是无穷大,这将以任何方式扭曲任何平均值。[事实上是无穷大。]@Dems这是真的,我想这将取决于个人功能。是的,认为你是对的,它是对的,感谢大家帮助我是的,认为你是对的,它是正确的,感谢大家帮助我