2

これが私のクエリです:

select * 
 from test n
WHERE lower(process_name) like 'test%'
  AND (   test_id is NULL 
       OR TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE),-6),'YYYYMM') > TO_CHAR(n.process_date,'YYYYMM')

process_dateクエリで日付フィールドが 6 か月を超えているかどうかを確認したい。

4

3 に答える 3

3

OracleがTO_CHARの結果に対して暗黙的なデータ型変換を行うかどうかをテストするのに便利なOracleインスタンスがありません。これは、完全に数値になるということです。それでも、TRUNCされたDATE値と比較すると、私には複雑すぎるようです...

Oracle での 6 か月以上前のレコードの場合:

n.process_date <= ADD_MONTHS(TRUNC(SYSDATE), -6)

正確に 6 か月を含めずに、より古いものを使用する場合は、等号演算子を削除します。

n.process_date < ADD_MONTHS(TRUNC(SYSDATE), -6)

MySQL で 6 か月以上前のレコードの場合:

n.process_date <= DATE(DATE_SUB(NOW(), INTERVAL 6 MONTH))

正確に 6 か月を含めずに、より古いものを使用する場合は、等号演算子を削除します。

n.process_date < DATE(DATE_SUB(NOW(), INTERVAL 6 MONTH))

MySQL の場合、DATEは Oracle の TRUNC と同様に機能します。

于 2010-08-13T00:29:34.733 に答える
1
SELECT *
  FROM test
 WHERE MONTHS_BETWEEN( SYSDATE, process_date ) > 6

MONTHS_BETWEEN(date1、date2)は(date1-date2)を返すため、引数の順序は重要です

月の数値を6だけ異ならせたい場合、たとえばこれが間違っている場合

    MONTHS_BETWEEN( '2010年6月13日'、'2010年1月16日')== 5.9

次に、次のことを行う必要があります。

SELECT *  
  FROM test
 WHERE MONTHS_BETWEEN( LAST_DAY(SYSDATE), LAST_DAY(process_date) ) >= 6

月の最後の日は正しく比較され、整数を返すことが保証されています


:これらのクエリはどちらも、使用可能な場合、「process_date」のインデックスを使用しません。「インデックス付き」ソリューションについては、OMGPoniesによる投稿とこのソリューションへのコメントを 参照してください。

于 2010-08-13T03:26:34.283 に答える
0

SQL Serverを使用している場合は、DATEDIFF()を使用できます。以下の例を参照してください。

DECLARE @a AS DATETIME = '2010-6-1 00:00'; -- Assignment and declaration in SQLS2008
DECLARE @b AS DATETIME = '2010-8-16 00:15';

-- usage: DATEDIFF(Interval, StartDate, EndDate)

SELECT      DATEDIFF(MONTH, @a, @b) AS MonthDifference,
            DATEDIFF(HOUR, @a, @b) AS HourDifference,
            DATEDIFF(MINUTE, @a, @b) AS MinuteDifference;

これから答えを差し引くことができます。目標を達成できなかった場合はお知らせください。

ありがとう。

于 2010-08-13T00:09:17.147 に答える