0

我遇到了以下问题:

我不得不从 MS SQL Server 迁移数据库,其中某些字段包含未按此类存储的日期值。例如,有一个带有“validfrom”和“validto”字段的“offers”字段。可悲的是,他们使用文本字段(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 更改为 date,但是当我这样做时,整个导入的数据会变得混乱。

有什么建议吗?

谢谢!

4

3 回答 3

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 小提琴演示

假设您仍在 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'

更多小提琴

于 2013-03-19T16:48:35.180 回答
1

对。这将进行字符串比较,并且您似乎首先拥有 DAY。这意味着 2013 年 3 月 21 日大于 2014 年 3 月 19 日......因为它首先比较排序的是日期。

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

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

于 2013-03-19T16:43:23.067 回答
0

也许是:

$query = "SELECT CAST(m.field as date) as field, m.* from mytable as m where m.field >='" . date('Y-m-d') . "';";
于 2013-03-19T16:41:41.907 回答