0

私は、フォームのフロントエンドからカレンダーの日付範囲の値を取得し、それを使用して、とりわけ、日時列を持たない Teradata テーブルのクエリをフィードすることを任されました。代わりに、日付は 2 つの varchar 列から集計されます。1 つは年 (CY = 今年、LY = 昨年、LY-1 など) で、もう 1 つは MonDD 形式の日付 (Jan13、Dec08 など) です。

フォームと結果ページに Coldfusion を使用しているため、クエリを動的に作成できますが、考えられるすべてのケースに対して適切な方法を思いつきません。何か案は?年の違いはさておき、範囲内の各日を直接比較する以外に、クエリ内に大量の個別の OR ステートメントが含まれている可能性があるとは考えられません。私はSQLの知識が不足しています-2つのvarchar列で何らかの変換を使用してSQL自体でスクリプトを作成し、日付比較を行うことができる実際の日付範囲を形成するより良い方法があるでしょうか?

4

2 に答える 2

2

VARCHAR以下は、開始するために日付値を受け取り、それにいくつかの基本的な操作を実行するSQLです。

SELECT CAST(CAST('Jan18'||TRIM(EXTRACT(YEAR FROM CURRENT_DATE)) AS CHAR(9)) AS DATE FORMAT 'MMMDDYYYY') AS BaseDate_
     , CASE WHEN Col1 = 'CY'
            THEN BaseDate_
            WHEN Col1 = 'LY'
            THEN ADD_MONTHS(BaseDate_, -12)
            WHEN Col1 = 'LY-1'
            THEN ADD_MONTHS(BaseDate_, -24)
            ELSE BaseDate_
       END AS DateModified_
  FROM {MyDB}.{MyTable};

このEXTRACT()関数を使用すると、DATETIME、またはTIMESTAMP値を分解できます。を使用TRIM()して、追加された空白をデータ型に変換してEXTRACT取り除きます。Teradata は日付がおかしいので、物事を整理するために double が必要になることがよくあります。DATEPARTCHARCAST()

このCASEステートメントは、使用することを提案したエンコードされた値を単純に取り、ADD_MONTHS()関数を使用して日付を操作します。日付はTeradata にあるため、日付に値をINTEGER追加して日付を 1 日ずらすこともできます。Oracle とは異なり、小数値を追加して の部分INTEGERを操作することはできません。!= Teradata では。TIMETIMESTAMPDATETIMESTAMP

于 2013-01-22T00:03:02.063 に答える
1

ロブはあなたにSQLのアプローチを与えました. または、ColdFusion を使用して、使用している列の値を生成することもできます。このようなものがうまくいくかもしれません。

sampleDate = CreateDate(2010,4,12);  // this simulates user input

if (year(sampleDate) is year(now())
    col1Value = 'CY';
else if (year(now()) - year(sampleDate) is 1)
    col1Value = 'LY'
else
    col1Value = 'LY-' & DateDiff("yyyy", sampleDate, now());

col2Value = DateFormat(sampleDate, 'mmmdd');

次に、col1Value と col2Value をパラメーターとしてクエリに送信します。

于 2013-01-22T01:20:35.853 に答える