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


Date comparison between MSSQL varchar and PHP string does not work - why?

所以我得到了一个在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。谁能告诉我如何正确比较日期?

如果您

愿意将Medoo的query()功能与quote()一起使用,请尝试以下操作:

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

根据记录,这将扼杀性能。不确定 MSSQL 的索引功能,但如果可能的话,我会添加一个具有此定义的索引

convert(date, 104)

php 具有这些函数,允许您将字符串转换为 dateTime 对象。

sql 服务器强制转换函数适用于字符串:

select cast ('02.01.2016' as date)

返回 2016-02-01

使用 php 函数创建日期时间变量,并将它们作为参数传递给 sql 服务器。 然后,您的查询类似于以下内容:

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

由于您正在比较字符串,因此 02.01.2016 大于 01.01.2017。切勿将日期存储为字符串,或者如果确实必须,至少使用可以比较的格式。也就是说,项目从大到小。则 2016.01.02 将小于 2017.01.01。

但是您仍然必须使用正确的格式等。使用正确的数据类型要容易得多。

如果设置了现有格式,则可以将 CONVERT 与样式 104 一起使用,将两面转换为 DATETIME 并进行比较。