从SQL文本字段按日期过滤

时间:2013-03-19 16:34:56

标签: php sql datetime

我遇到了以下问题:

我不得不从MS SQL Server迁移数据库,其中某些字段包含未存储的日期值。例如,存在具有“validfrom”和“validto”字段的字段“offer”。可悲的是,他们使用文本字段(varchar)进行输入,现在我很难按日期过滤它。示例如下:

datefrom = "21.01.2012"
dateto = "21.05.2012"

现在我尝试使用

按日期排序旧条目
$curDate = date('d.m.Y'); // Outputs 19.03.2013

在我的PHP PDO中,我使用以下查询

$query = "SELECT * from mytable where validtill >= '$curDate'"

将输出

$query = "SELECT * from mytable where validtill >= '19.03.2013'"

我仍然从2011年收到日期条目的旧条目。我想我错过了一些东西 - 也许我不能将字符串比作“日期”。我尝试将字段从vharchar更改为日期,但是当我这样做时,整个导入的数据都搞砸了。

有什么建议吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

在您的问题中,您说您必须从MS Sql Server迁移 - 您迁移到哪个数据库?您需要将varchar字段转换为日期以进行日期比较。

假设MySQL,那么你可以使用str_to_date。这样的事情应该有效:

select str_to_date(dtfield, '%d.%m.%Y')
from yourtable
where str_to_date(dtfield, '%d.%m.%Y') > str_to_date('1/20/2012', '%m/%d/%Y')

SQL Fiddle Demo

假设您仍在SQL Server中,那么您必须删除日期的每个部分,以SQL Server理解的格式输入日期,然后使用CONVERT将其数据类型更改为日期:

SELECT CONVERT(datetime,RIGHT(dtfield,4)+SUBSTRING(dtfield,4,2)+LEFT(dtfield,2))
FROM yourtable
WHERE CONVERT(datetime,RIGHT(dtfield,4)+SUBSTRING(dtfield,4,2)+LEFT(dtfield,2)) > '1/20/2012'

More Fiddle

答案 1 :(得分:1)

右。这将进行字符串比较,看起来你先拥有DAY。这意味着2013年3月21日大于2014年3月19日......因为它与排序相比的第一件事就是当天。

如果您可以将数据重新排列为Y.m.d,则此文本字符串比较将起作用,即2013> 2012> 2011年和2013-02-xx> 2012-02-xx ...

我的建议是在数据库中创建一个新列,并且可以使用PHP脚本将新的正确值转换并存储为日期。

答案 2 :(得分:0)

也许那样:

$query = "SELECT CAST(m.field as date) as field, m.* from mytable as m where m.field >='" . date('Y-m-d') . "';";