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 实例来测试 Oracle 是否会对 TO_CHAR 结果进行隐式数据类型转换,因为它将完全是数字。不过,与 TRUNC 的 DATE 值相比,对我来说似乎过于复杂......

对于 Oracle 中六个月或更早的记录:

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

如果您想要更旧但不包括六个月 - 删除等号运算符:

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

对于 MySQL 中六个月或更早的记录:

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

如果您想要更旧但不包括六个月 - 删除等号运算符:

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),因此 args 的顺序很重要

如果您希望月份的数字相差 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”上的索引。对于“索引”解决方案,请参阅OMG Ponies 的帖子和对此的评论

于 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 回答