1

データが日付である列からデータを選択するクエリがあります。問題は、データにテキストと日付が混在していることです。

この SQL のビットは、最長のテキスト フィールドのみを返します。

SELECT MAX(field_value)

日付が発生する場所は、常に xx/xx/xxxx の形式です。

最新の日付を選択しようとしています。

私はMS SQLを使用しています。

誰でも助けることができますか?

4

3 に答える 3

2

ISDATEと を使用してこれを試してくださいCONVERT

SELECT MAX(CONVERT(DateTime, MaybeDate))
FROM (
  SELECT MaybeDate
  FROM MyTable
  WHERE ISDATE(MaybeDate) = 1) T

を使用することもできますMAX(CAST(MaybeDate AS DateTime))。私は何CONVERT年も前に使用する(おそらく悪い?)習慣になり、それを使い続けてきました。

于 2013-06-10T11:29:01.030 に答える
0

変換エラーなしでこれを行うには:

select max(case when isdate(col) = 1 then cast(col as date) end)  -- or use convert()
from . . .

SQL ステートメントは、操作の順序を指定しません。したがって、whereサブクエリに句を含めても、日付のみが変換されることは保証されません。実際、SQL Server オプティマイザーは、データが取り込まれたときに変換を行い、その後でフィルター処理を行うほど「スマート」です。

操作の順序付けを保証する唯一の操作はcaseステートメントであり、それには例外もあります。

于 2013-06-10T11:30:41.240 に答える
0

別の解決策は、WHERE 句で PATINDEX を使用することです。

SELECT PATINDEX('[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]', field_value)

このアプローチの問題点は、何かが日付かどうか本当にわからないことです (たとえば、99/99/9999 は日付ではありません)。IS_DATE の問題は、構成 (DATEFORMAT など) に依存することです。したがって、適切なオプションを使用してください。

于 2013-06-10T11:44:39.630 に答える