2

形式の日付列でレコードをフィルター処理するクエリ アイテムがあります'YYYYMM。今のところ、現在の月と年のレコードを取得するために値[DateCol] = '201406'をハードコーディングしました。Detail filtersしかし、私はこの値を動的に変更したいと考えています。来月は「201407」でレコードをフィルタリングする必要があります。どうすればこれを達成できますか? をドラッグしてこれを試し[DateCol]ましたDetail filters

[DateCol] = extract(year, current_date) + extract(month, current_date)

しかし、それはエラーを返しました:

UDA-SQL-0460 The operation "equal" is invalid for the following combination of data types: Character and Integer

ガイドしてください

4

3 に答える 3

2

最も簡単な解決策は、年と月の整数表現である「月キー」と呼ばれるものを作成することです。次に、比較のためにこれを char に変換できます。それは実際には非常に簡単です:

extract(year, current_date) * 100 + extract(month, current_date)

任意の数値に 100 を掛けると、最後に 2 つのゼロが追加されます。現在の年は 2014 年であるため、2014 年に 100 を掛けると 201400 になります。その後、月を自由に追加して「月のキー」を取得できます。201400 + 6 = 201406. 次に、この整数を char に変換して比較できます。最終的なフィルター式は次のようになります。

[DateCol] = cast(extract(year, current_date) * 100 + extract(month, current_date), char(6))

注: 日付の整数「キー」を作成する手法は、日単位にも拡張でき、多くのアプリケーション、つまり並べ替えがあります。次の式は、元の日付の数値順と階層を保持する整数の「日キー」を提供します。

extract(year, current_date) * 10000 + extract(month, current_date) * 100 + extract(day, current_date)
于 2014-06-27T17:05:48.830 に答える
1

2 つの問題。DateCol のデータ型は文字です。抽出関数は整数を返しています。第二に、抽出物を使用して YYYYMM を正しく構築していません。あなたのやり方では、年を数値として抽出し、それに月を追加します。'201406' = 2020 のような結果になり、うまくいきません。したがって、両方の抽出をキャストして連結する必要があります。

[DateCol] = cast(extract(year, current_date) as varchar(4) 

+ キャスト (抽出 (月、現在の日付) を varchar(2) として)

編集: 実際には、おそらくそれよりも複雑になるでしょう。Extract は 6 月の 06 を返さず、6 だけを返します。したがって、その抽出が 1 文字なのか 2 文字なのかを判断する必要があります。1 の場合は、キャスト後に前に「0」を付ける必要があります。正確な構文はデータベースによって異なりますが、次のようになります。

[DateCol] = cast(extract(year, current_date) as varchar(4)
+ case when cast (extract(month, current_date) as varchar(2) = 1
    then '0' + cast (extract(month, current_date) as varchar(2)
  else cast (extract(month, current_date) as varchar(2)
end
于 2014-06-27T16:34:56.290 に答える