正在生效:
select id from table where find_in_set(month(curdate()),allowmonth) and unix_timestamp(curdate()) between unix_timestamp(sdate) and unix_timestamp(edate);
即将生效:
select id from table where unix_timestamp(curdate()) between unix_timestamp(sdate) and time_stamp(edate);
已经过期:
select id from table where unix_timestamp(curdate()) > unix_timestamp(edate);这个解决办法.还差一些...字段有些调整...

解决方案 »

  1.   

    SELECT *,
    (CASE ( SELECT 999 FROM Sys_Stock WHERE ID=A.ID AND (MONTH(GETDATE()) BETWEEN MONTH(A.sdate) AND MONTH(B.edate)) AND MONTH(GETDATE()) IN (A.allowmonth) )
    WHEN 999 THEN '有效'
    Else '过期'
    END)AS 标记
    FROM 表 AS A老虎不发威你当我是病猫,这语句估计要牛人优化一下,我暂时没考虑优化,只考虑结果你查一次看看是不是你要的结果,这次有效和过期一起查!SQL Server 2005 测试通过
      

  2.   

    你Copy进去查询分析器,把表的名字改一下,我已经按照你给的解构,改了字段名
      

  3.   

    MySQL有没有 Case 子句? 不好意思我不知道,没深入用过MySQL
      

  4.   

    你如果有SQL Server,你Copy些数据进去测试一下,看我的结果错了没有
      

  5.   

    MONTH 判断会让你丢失对年的判断,会出现错误吧...datediff,在sql里面我用的是这个..
      

  6.   

    我以为你只要判断月份,你的allowmonth字段只有月份,如果需要精确,我看过了,直接去掉BETWEEN里面的两个MONTH函数即可,那两个也是多于的。临近过期或者即将生效也可以查出来,我拿人头担保
      

  7.   

    估计这道题我应该可以任职DBA了
      

  8.   

    本省就是啊,一开始我给的语句是只查一种情况。但是改动后可以查两种情况要查临近过期或即将生效的确有点麻烦,可能要多一个字段出来,但是这里可以通过前台的一个函数解决问题,你不一定要全部用SQL吧
      

  9.   

    CASE里面我不知道能不能嵌套,如果可以嵌套绝对可以用一个字段表示你的四种模式(有效、临近过期、过期、临近生效)不能嵌套我就得用两个字段来表示
      

  10.   

    呵呵,前台程序判定吧
    sql语句能否在1,2,3,4中找到最大值4?
    你现在的需求是如果edate年份为本年,如果当前月份大于disp_month中最大的月份,则过期。否则为即将生效?
      

  11.   

    嗯,大概差不多,看来只有前台了...那就结帖吧.create  table t (travel_id int, [b_date] datetime,[e_date] datetime, disp_month varchar(50))
    insert T select  1,       '2006-12-12',            '2008-12-12',     '1,2,3,4,10,12'
    union all select 2,       '2006-11-12',            '2007-12-12',     '1,9'
    union all select 3,       '2006-1-12',            '2006-12-12',     '1,2,9'
    union all select 4,       '2006-1-12',            '2005-12-12',     '1'
    union all select 5,       '2006-12-12',            '2008-12-12',     '10,12'
    union all select 6,       '2006-12-12',            '2007-12-12',     '1,2,'
      

  12.   

    我再去mysql中问一下吧,前台效果就很麻烦了..
      

  13.   

    临近过期的我已经搞出来了,不过是用的起始时间和结束时间SELECT *,
    (CASE ( SELECT '有效' FROM Sys_Stock AS TEMP WHERE TEMP.ID=Sys_Stock.ID AND (GETDATE() BETWEEN TEMP.InsertTime AND TEMP.UpdateTime) AND MONTH(GETDATE()) IN (1,2,3) )
    WHEN '有效' THEN ( CASE ( SELECT '临近过期' FROM Sys_Stock AS TEMP1 WHERE TEMP1.ID=Sys_Stock.ID AND MONTH( TEMP1.UpdateTime )=MONTH( GETDATE() ) )
    WHEN '临近过期' THEN '临近过期'
    ELSE '有效'
      End )
    Else ( CASE ( SELECT '即将生效' FROM Sys_Stock AS TEMP2 WHERE TEMP2.ID=Sys_Stock.ID AND MONTH( TEMP2.InsertTime )=MONTH( GETDATE() ) )
    WHEN '即将生效' THEN '即将生效'
    ELSE '过期'
       End )
    END)AS 标记
    FROM Sys_Stock
      

  14.   

    上面是我自己的,既然结贴了,我就没改字段名我用的等于,把临近的月份判断那里改成 大于小于,然后再研究一下怎么和allowmonth值比较,估计可以,不过我时间继续给你搞了。工作第一