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 日までの範囲で、各エントリは 1 時間を表しています。ここで、テーブルの一部、たとえば 2017 年全体を PHP スクリプトにロードしたいと考えています。そのためには、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

query()Medoo の機能を一緒に使用したい場合はquote()、これを試してください。

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

記録として、これはパフォーマンスを低下させます。MSSQL のインデックス機能についてはわかりませんが、可能であればこの定義でインデックスを追加します

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

php には、文字列を dateTime オブジェクトに変換できるこれらの関数があります。

SQL サーバーのキャスト関数は、文字列に対して機能します。

select cast ('02.01.2016' as date)

2016-02-01 を返します

php 関数を使用して datetime 変数を作成し、それらをパラメーターとして SQL サーバーに渡します。次に、クエリは次のようになります。

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 に答える