在数据库表中我创建了一个日期属性,但是我将它的类型设置为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';
我很感激如何做到这一点的一个例子。 谢谢你的帮助。
答案 0 :(得分:1)
您需要转换/强制转换为比较:
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'
;
答案 1 :(得分:0)
是的,您可以将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';
答案 2 :(得分:0)
在进行任何比较之前,您可以将varchar
转换或转换为date
或datetime
。
但你必须每次都这样做你将日期与某些东西进行比较。这是因为如果将它们比作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)
将失败。
因此,我强烈建议您将列更改为date
或datetime
。它会让你的生活更轻松。