MSSQL varchar和PHP字符串之间的日期比较不起作用 - 为什么?

时间:2016-02-22 16:44:46

标签: php sql sql-server date medoo

所以我在Microsoft SQL Server 11上运行了一个数据库,表hpfc_prices包含按时间顺序排列的多个条目,大致如下所示:

|date (varchar(255))|time (varchar(255))|price (decimal(25,10))|
|===================|===================|======================|
|01.01.2016         |00:00              |[some value]          |
|01.01.2016         |01:00              |[some value]          |
|01.01.2016         |02:00              |[some value]          |
|...                |...                |...                   |
|01.01.2016         |23:00              |[some value]          |
|02.01.2016         |00:00              |[some value]          |
|02.01.2016         |01:00              |[some value]          |
|...                |...                |...                   |

此表格涵盖2016年1月1日至2020年12月31日,每个条目代表一小时。现在我想在PHP脚本中加载表的一部分,比如2017年全年。为此我必须使用Medoo作为数据库框架,我正在运行以下代码:

$db = new medoo($database_config);
$hpfcStart = "01.01.2017";
$hpfcEnd = "31.12.2017";
$arr = $db->select("hpfc_prices",["date","time","price"],["AND" => ["date[>=]" => $hpfcStart, "date[<=]" => $hpfcEnd]]);
var_dump($arr);

Medoo查询通过调试转换为此SQL查询:

SELECT "date","time","price" FROM "hpfc_prices" WHERE "date" >= '01.01.2017' AND "date" <= '31.01.2018

现在的问题是输出现在包含所有表,而不仅仅是2017年的所有条目。我假设查询在日期比较时失败,因为Medoo将字符串与varchar进行比较。根据我的经验,这适用于MySQL,但我对MSSQL / Medoo不太确定。谁能告诉我如何正确比较日期?

3 个答案:

答案 0 :(得分:2)

如果您愿意在query()旁边使用Medoo的quote()功能,请尝试以下操作:

WHERE convert(date, 104) >= convert('01.01.2017', 104)

为了记录,这将破坏性能。不确定MSSQL的索引功能,但如果可能,我会添加一个带有此定义的索引

convert(date, 104)

答案 1 :(得分:1)

php有these functions,允许您将字符串转换为dateTime对象。

sql server cast函数适用于你的字符串:

select cast ('02.01.2016' as date)

返回2016-02-01

使用php函数创建日期时间变量并将它们作为参数传递给sql server。然后您的查询类似于:

where cast([date] as date) >= @firstParameterFromPHP
and cast([date] as date) < @secondParameterFromPHP

答案 2 :(得分:0)

由于您正在比较字符串,因此02.01.2016大于01.01.2017。您永远不应该将日期存储为字符串,或者如果您确实需要,至少使用可以比较的格式。也就是说,物品从大到小。那么2016.01.02将小于2017.01.01。

但是你仍然需要使用正确的格式化等。使用正确的数据类型会更容易。

如果设置了现有格式,则可以使用样式104的CONVERT将双方转换为DATETIME并进行比较。