繁体   English   中英

SQL比较日期

[英]SQL Comparing Dates

在数据库表中,我设置了date属性,但是将其类型设置为varchar而不是Date。 我的问题是,我仍然可以在SQL查询中比较这些日期吗?

我数据库中的日期以以下格式存储:

dd / mm / yyyy hh:mm:ss

我必须在PHP中执行如下所示的SQL查询:

SELECT *
FROM DBtable
WHERE DBname='$name' AND date>='01/01/2015' AND date<='01/09/2015';

我将欣赏一个如何做到这一点的例子。 谢谢您的帮助。

您需要转换/广播以进行比较:

SELECT *
FROM DBtable
WHERE DBname='$name' 
  AND CAST(date AS DATETIME) >='2015-01-01' 
  AND CAST(date AS DATETIME)<='2015-01-09'
;

最好将值存储为适当的数据类型,以避免这种低效率。 如果要在没有时间部分的情况下进行比较,也可以使用DATE而不是DATETIME 语法和可用的数据类型因数据库而异,因此上述内容可能需要调整。

更新:由于您使用的是MySQL,因此可以使用以下内容:

SELECT *
FROM DBtable
WHERE DBname='$name' 
  AND STR_TO_DATE(`date`, '%d/%c/%Y') >= '2015-01-01' 
  AND STR_TO_DATE(`date`, '%d/%c/%Y') <= '2015-01-09'
;

是的,您可以将Varchar转换为Date 这是一个例子:

SELECT
CAST(date_column AS DATETIME) 
FROM 
TABLE_NAME

在您的情况下,它可能看起来像:

SELECT *
FROM DBtable
WHERE DBname='$name' 
AND CAST(date AS DATETIME) >='01/01/2015' 
AND CAST(date AS DATETIME) <='01/09/2015';

在进行任何比较之前,可以将varchar转换为datedatetime时间。

但是, 每次将日期与某事进行比较时,您都必须这样做。 这是因为如果将它们与varchar进行比较,则以下比较都是正确的:

'2/1/2015' > '1/5/2016'
'25/1/2015' > '15/2/2015'
'11/1/2015' < '3/1/2015'

如果您想提取日期的某些基于时间的方面,例如在8:00 AM之前的任何记录,则还需要进行转换。 如果您的日期是varchar ,则没有简单的方法可以做到这一点。

并假定数据库中的值始终可以解析为日期! 如果一个空字符串或其他类型的数据进入那里,则CONVERT(datetime, MyColumn)将失败。

因此,我强烈建议您将列更改为datedatetime 这将使您的生活更加轻松。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM