我现在有一个表,包括两个日期,一个是生效日期,一个是失效日期,都是存的text类型,生效日期一定不为空,失效日期有的为空。
我设置查询条件可以指定一个开始日期和一个结束日期,来查询所有失效日期在那个时间段的数据。
请大家帮我看看这个查询语句应该怎么写呀。谢谢。

解决方案 »

  1.   

    select * from tb where convert(varchar(10),失效日期,120) between '' and ''
      

  2.   


    SELECT * FROM tb WHERE CONVERT(CHAR(10),失效日期,21) BETWEEN 开始日期 and 结束日期
      

  3.   


    --失效日期为空的是不满足 “BETWEEN 开始日期 AND 结束日期” 的,请放心使用 :)
      

  4.   

    select * from tb
    where cast(cast(失效日期 as nvarchar) as datetime) between @startdate and @enddate
    失效日期为空的数据也能被过滤掉。
      

  5.   

    ps:第一次见到用text来存日期的……
      

  6.   

    declare @start datetime, @end datetime
    select @start='2008-12-05', @end='2008-12-31'
    select * from tb where convert(datetime,[失效日期]) between @start and @end
      

  7.   


    docno    rev   project  effective_date   obsolete_date
    mei-01    1     aq          2008-10-01                    
    mei-02    1     de          2008-9-25     2008-10-2
    mei-02    2     de          2008-10-2还有一个问题,我输入查询条件的时候还有可能只输入开始日期,还没有结束日期,或者反过来 。
      

  8.   

    因为我开始做的时候用的日期型,后来不知道哪里出一点问题,就用text来存的了,一直还没改过来。让你见笑了
      

  9.   

    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([docno] varchar(6),[rev] int,[project] varchar(2),[effective_date] varchar(10),[obsolete_date] varchar(10))
    insert [tb]
    select 'mei-01',1,'aq','2008-10-01',null union all
    select 'mei-02',1,'de','2008-9-25','2008-10-2' union all
    select 'mei-02',2,'de','2008-10-2',nullselect * from [tb]declare @sdate datetime,@edate datetime
    select @sdate='2008-9-9',@edate='2008-12-25'select * from tb
    where [obsolete_date] between isnull(nullif(@sdate,''),'1753-01-01') and isnull(nullif(@edate,''),'9999-12-31')
    --测试结果:
    /*
    docno  rev         project effective_date obsolete_date
    ------ ----------- ------- -------------- -------------
    mei-02 1           de      2008-9-25      2008-10-2(1 行受影响)
    */
      

  10.   

    如果真用text存日期的话……
    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([docno] varchar(6),[rev] int,[project] varchar(2),[effective_date] text,[obsolete_date] text)
    insert [tb]
    select 'mei-01',1,'aq','2008-10-01',null union all
    select 'mei-02',1,'de','2008-9-25','2008-10-2' union all
    select 'mei-02',2,'de','2008-10-2',nullselect * from [tb]declare @sdate datetime,@edate datetime
    select @sdate='2008-9-9',@edate='2008-12-25'select * from tb
    where cast([obsolete_date] as nvarchar) between isnull(nullif(@sdate,''),'1753-01-01') and isnull(nullif(@edate,''),'9999-12-31')
    --测试结果:
    /*
    docno  rev         project effective_date obsolete_date
    ------ ----------- ------- -------------- -------------
    mei-02 1           de      2008-9-25      2008-10-2(1 行受影响)
    */
      

  11.   


    如果sdate或edate为空对结果有影响吗?