关于sql中的日期

时间:2010-08-12 23:55:41

标签: sql oracle plsql date-arithmetic

这是我的疑问:

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个月。

3 个答案:

答案 0 :(得分:3)

我没有一个方便的Oracle实例来测试Oracle是否会对TO_CHAR结果进行隐式数据类型转换,因为它将完全是数字。不过,在与TRUNC'd DATE值进行比较时,对我来说似乎过于复杂......

对于Oracle中六个月或更长时间的记录:

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

如果你想要更老但不完全包括六个月 - 删除equals运算符:

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

对于MySQL中六个月或更长时间的记录:

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

如果你想要更老但不完全包括六个月 - 删除equals运算符:

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

对于MySQL,DATE的表现类似于Oracle的TRUNC。

答案 1 :(得分:1)

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

MONTHS_BETWEEN(date1,date2)返回(date1 - date2),因此args的顺序很重要

如果您希望月份数字相差6,例如,如果这对您有误

    MONTHS_BETWEEN( 'JUN 13 2010', 'JAN 16 2010') == 5.9 

然后你应该:

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

保证几个月的最后几天正确比较并返回整数


注意:这两个查询都不会在“process_date”上使用索引(如果可用)。对于“索引”解决方案,请参阅post by OMG Ponies并对此进行评论

答案 2 :(得分: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;

您可以从中扣除答案。如果我错过了目标,请告诉我。

感谢。