0

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

4

3 回答 3

2

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

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

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

convert(date, 104)
于 2016-02-22T17:00:44.777 回答
1

php 具有这些功能,可让您将字符串转换为 dateTime 对象。

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

select cast ('02.01.2016' as date)

返回 2016-02-01

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

where cast([date] as date) >= @firstParameterFromPHP
and cast([date] as date) < @secondParameterFromPHP
于 2016-02-22T17:49:56.783 回答
0

由于您正在比较字符串,因此 02.01.2016 大于 01.01.2017。你永远不应该将日期存储为字符串,或者如果你真的必须,至少使用一种可以比较的格式。也就是说,项目从大到小。那么 2016.01.02 将小于 2017.01.01。

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

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

于 2016-02-22T16:51:26.397 回答