我有一个类型为“datetime”的列,其值如2009-10-20 10:00:00
我想从datetime中提取date并写一个查询:
SELECT * FROM
data
WHERE datetime = '2009-10-20'
ORDER BY datetime DESC
以下是最好的方法吗?
SELECT * FROM
data
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC
然而,这将返回一个空结果集。有什么建议吗?
尽管页面上的所有答案都将返回所需的结果,但它们都存在性能问题。永远不要对WHERE子句中的字段执行转换(包括DATE()计算),因为必须对表中的所有行执行转换。
BETWEEN…AND构造包含了这两种边界条件,要求在结束日期指定23:59:59语法,这本身就有其他问题(微秒事务,我相信在2009年问这个问题时MySQL还不支持)。
查询特定日期的MySQL时间戳字段的正确方法是根据所需的日期检查大于等于字段,并检查之后一天的小于字段,而不指定小时。
WHERE datetime>='2009-10-20' AND datetime<'2009-10-21'
这是执行速度最快、内存消耗最小、资源消耗最少的方法,而且还支持MySQL的所有特性和极端情况,比如亚秒级时间戳精度。此外,它是未来的证明。
你可以使用:
DATEDIFF ( day , startdate , enddate ) = 0
或者:
DATEPART( day, startdate ) = DATEPART(day, enddate)
AND
DATEPART( month, startdate ) = DATEPART(month, enddate)
AND
DATEPART( year, startdate ) = DATEPART(year, enddate)
Or:
CONVERT(DATETIME,CONVERT(VARCHAR(12), startdate, 105)) = CONVERT(DATETIME,CONVERT(VARCHAR(12), enddate, 105))