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