只用SQL语句一个表中有顾客姓名字段、日期字段,日期为顾客的生日。
现要求有最少的语句求出三天内要过生日的顾客的姓名如当天是2005-01-10 则顾客生日为01月10号\01月11号\01月12号的都要列出来
注意跨年月和润年29号的情况!

解决方案 »

  1.   

    rs.open "select  * from talbe  where 日期字段  between  " & date-1 &" and  " & date-1 &" ",cn,1,3
      

  2.   

    后面一个应该是+
    rs.open "select  * from talbe  where 日期字段  between  " & date-1 &" and  " & date+1 &" ",cn,1,3
      

  3.   

    改成这样怎么样?
    dim datestr as stringdatestr=dtpicker1.valuers.open "select  * from talbe  where 日期字段  between  '" & datestr &"' and  '" & datestr+2& "' ",cn,1,3
      

  4.   

    rs.open "select  * from talbe  where 日期字段  between  '" & date-1 & "' and  '" & date+1 & "'",cn,1,3
      

  5.   

    Dim curDate As Date, aftDate As Date
    Dim strSQL As String
        
    curDate = Now
    aftDate = DateAdd("d", 2, curDate)
        
    strSQL = "SELECT * FROM TABLENAME WHERE 日期字段 BETWEEN '" & Format(curDate, "YYYY/MM/DD") & "' AND '" & Format(aftDate, "YYYY/MM/DD") & "'"
      

  6.   

    SQL语句日期的分隔符根据你数据库的类型自己改一下吧,ACCESS用#号括起来,其他数据库用'单引号括起来!!
      

  7.   

    还有,是要过生日的,过了的就不算了,而且生日的话不可能都是今年出生的人吧!
    所以直接用date去比较怕是不行吧,很多都忘了这一点了的
      

  8.   

    苯办法比较,存储过程 
    create proc betweenday 
    @bday as varchar(50),@eday as varchar(50)
    as
    begin
    select  * from talbe  where (year(getdate())+ '-' + month(生日字段) + '-' + day(生日字段)) between   year(getdate())+ '-' + @bday and year(getdate())+ '-' + @eday
    end
    go
    sql中调用
    exec betweenday '1-10','1-13'
      

  9.   

    SELECT * FROM TABLENAME WHERE {fn Year(CURDATE())}+'-'+{fn Month(日期字段)}+'-'+Day(日期字段 ) BETWEEN {fn Year(CURDATE())}+'-'+{fn Month(CURDATE() )}+'-'+Day(CURDATE()) AND DateADD(Day,2,CURDATE())
    说明:
    CURDATE():SQL命令,取得当前日期
    {Fn Year()}:SQL命令,取得时间格式的年部分,{Fn Month()}、Day()类似;
    DateADD:SQL命令,日期加。
      

  10.   

    cuizm(射天狼)办法可以,改一下,在ACCESS中通过:  
    ...... 
        Dim sql As String
        Dim iDate, aftDate
        
        iDate = Format(Text1.Text, "MM-DD-YYYY")
        aftDate = Format(DateAdd("d", 2, iDate), "MM-DD-YYYY")
        'Debug.Print aftDate
        sql = "select * from tb_birthday " & _
            "where birthday between #" & iDate & "# and #" & aftDate & "#"
    ......
    在text1中输入:2004-12-30 查询结果:
    2004-12-30 
    2004-12-31 
    2005-1-1 在text1中输入:2004-12-31 查询结果:
    2004-12-31 
    2005-1-1 
    2005-1-2
      

  11.   

    先用生成两个日期
    然后在sql语句里面用between子句
      

  12.   

    因为SQL数据库中SQL语句不支持format函数,所以要在代码中先处理一下日期格式
      

  13.   

    同意 samwzhang()  的 !
    楼主试试看啦!
      

  14.   

    当然偶的是对的了,这是经验啊。Year、Month、Hour、Minute、Second是fn函数,Day却不是;这可是偶用血的教训得来的。
      

  15.   

    samwzhang() 都没仔细看楼主的回话哦
    当天2004-12-31日,生日NN年1月1日
    你的就成了
    2004年1月1日 between 2004-12-31日 and 2005-1-2日
    能行吗。
    劝楼主多分几段,按实际情况写几个sql就行了。
      

  16.   

    1、
    SELECT * FROM TABLENAME WHERE ({fn Year(CURDATE())}+'-'+{fn Month(日期字段)}+'-'+Day(日期字段 ) BETWEEN {fn Year(CURDATE())}+'-'+{fn Month(CURDATE() )}+'-'+Day(CURDATE()) AND DateADD(Day,2,CURDATE())) or (({fn Year(CURDATE())+1)}+'-'+{fn Month(日期字段)}+'-'+Day(日期字段 ) BETWEEN {fn Year(CURDATE())}+'-'+{fn Month(CURDATE() )}+'-'+Day(CURDATE()) AND DateADD(Day,2,CURDATE())) 
      

  17.   

    2、
    SELECT * FROM TABLENAME WHERE (({fn Year(CURDATE())}+'-'+{fn Month(日期字段)}+'-'+Day(日期字段 ) BETWEEN {fn Year(CURDATE())}+'-'+{fn Month(CURDATE() )}+'-'+Day(CURDATE()) AND DateADD(Day,2,CURDATE()))*(Datediff(Day,CURDate(),{fn Year(CURDATE())}+'-12-31')>=2)+(({fn Year(CURDATE())+1)}+'-'+{fn Month(日期字段)}+'-'+Day(日期字段 ) BETWEEN {fn Year(CURDATE())}+'-'+{fn Month(CURDATE() )}+'-'+Day(CURDATE()) AND DateADD(Day,2,CURDATE()))*(Datediff(Day,CURDate(),{fn Year(CURDATE())}+'-12-31')<2) )
      

  18.   

    一句SQL语句可能不行吧。
    试试:
        Dim sql As String
        Dim iDate(2) As String
        Dim iNow, i
        
        iNow = Format(Text1.Text, "MM-DD-YYYY")
        For i = 0 To 2
            iDate(i) = Format(DateAdd("d", i, iNow), "M-D")
        Next i
        sql = "select * from tb_birthday " & _
            "where (month(birthday) & '-'& day(birthday)) "& _
            "in ('" & iDate(0) & "',  '" & iDate(1) & "','" & iDate(2) & "')"
      

  19.   

    SELECT *
    FROM TABLENAME
    WHERE (STUFF(STUFF(STUFF(DAY(日期字段), 1, 0, '-'), 1, 0, { fn MONTH(日期字段) }), 1, 0, 
          '2004-') BETWEEN STUFF(STUFF(STUFF(DAY(GETDATE()), 1, 0, '-'), 1, 0, 
          { fn MONTH(GETDATE()) }), 1, 0, '2004-') AND DATEADD(Day, 2, 
          STUFF(STUFF(STUFF(DAY(GETDATE()), 1, 0, '-'), 1, 0, { fn MONTH(GETDATE()) }), 1, 0, 
          '2004-'))) OR
          (DATEADD(Year, 1, STUFF(STUFF(STUFF(DAY(日期字段), 1, 0, '-'), 1, 0, 
          { fn MONTH(日期字段) }), 1, 0, '2004-')) BETWEEN 
          STUFF(STUFF(STUFF(DAY(GETDATE()), 1, 0, '-'), 1, 0, { fn MONTH(GETDATE()) }), 1, 0, 
          '2004-') AND DATEADD(Day, 2, STUFF(STUFF(STUFF(DAY(GETDATE()), 1, 0, '-'), 1, 0, 
          { fn MONTH(GETDATE()) }), 1, 0, '2004-')))
      

  20.   

    SELECT *
    FROM TABLENAME
    WHERE (DATEDIFF(Day, STUFF(STUFF(STUFF(DAY(日期字段), 1, 0, '-'), 1, 0, 
          { fn MONTH(日期字段) }), 1, 0, '2004-'), STUFF(STUFF(STUFF(DAY(GETDATE()), 1, 0, '-'), 
          1, 0, { fn MONTH(GETDATE()) }), 1, 0, '2004-')) <= 0) AND (DATEDIFF(day, 
          STUFF(STUFF(STUFF(DAY(日期字段), 1, 0, '-'), 1, 0, { fn MONTH(日期字段) }), 1, 0, 
          '2004-'), DATEADD(Day, 2, STUFF(STUFF(STUFF(DAY(GETDATE()), 1, 0, '-'), 1, 0, 
          { fn MONTH(GETDATE()) }), 1, 0, '2004-'))) >= 0) OR
          (DATEDIFF(Day, DATEADD(Year, 1, STUFF(STUFF(STUFF(DAY(日期字段), 1, 0, '-'), 1, 0, 
          { fn MONTH(日期字段) }), 1, 0, '2004-')), STUFF(STUFF(STUFF(DAY(GETDATE()), 1, 0, 
          '-'), 1, 0, { fn MONTH(GETDATE()) }), 1, 0, '2004-')) <= 0) AND (DATEDIFF(Day, 
          DATEADD(Year, 1, STUFF(STUFF(STUFF(DAY(日期字段), 1, 0, '-'), 1, 0, 
          { fn MONTH(日期字段) }), 1, 0, '2004-')), DATEADD(Day, 2, 
          STUFF(STUFF(STUFF(DAY(GETDATE()), 1, 0, '-'), 1, 0, { fn MONTH(GETDATE()) }), 1, 0, 
          '2004-'))) >= 0)
    这个对了,偶调试过了。真晕!!!!!!
      

  21.   

    "select * form person where birthdate >= #" & Date - 3  & "# and birthdate <= #" &  Date+3  & "#"系统会自动判断是否为 润年 润月
      

  22.   

    楼上的,所有人都是今年生的是吧??
    看了这么多人回复还是 samwzhang() 比较执着,不过其可读性也。过两天结贴吧,再顺便贴下我的,看还有不有高人到场!
      

  23.   

    samwzhang(), 你是谁啊? 这么强?
      

  24.   

    居然没有高手来???看我的存储过程:
    create function GetBirth(@birthdate datetime)
     returns @birthTable table (client_name varchar(30),birth datetime)
    as 
    begin
       if month(@birthdate)=month(@birthdate+2) then
          insert into @birthtable select client_name,birth from clienttable 
                   where month(birth)=month(@birthdate) 
                         and day(birth)>=day(@birthdate)and day(birth)<=day(@birthdate+2)
       else
          insert into @birthtable select client_name,birth from clienttable 
                   where (month(birth)=month(@birthdate) and and day(birth)>=day(@birthdate))
                   or ((month(birth)=month(@birthdate+2) and day(birth)<=day@birthdate+2))
       return
    end--调用:
    select * from getbirth('2003-02-28')
      

  25.   

    不好意思,手误,多写了个then
      

  26.   

    运算速度:程序<存储过程<SQL语句
    可读性:SQL语句<存储过程<程序
    你出题的时候只要求最少的SQL语句,那偶自然是一句话给你实现了。
    说话不算,尽耍赖。
      

  27.   

    我不用存储过程,也是一个判断啊,sql有if 语句的吧
      

  28.   

    嘿嘿,SQL没有IF语句,只有个IIF还只能判断字段为空。
      

  29.   

    存储过程里有IF命令,但是SQL语句里没有,自己试试吧。
      

  30.   

    我在SQL2000里的查询分析器里就是用的IF语句,没问题啊
      

  31.   

    SQL语句是ADODB的部分,而存储过程是ADOX部分。前者是数据读写,后者是数据库结构处理。这里边的差异大啦。三层结构的模式是要求尽量减少使用ADOX的,最好不用ADOX的。那么你的存储过程要使用只有事先建立,想动态操作,就不怎么科学啦。偶的语句可是横扫的。嘿嘿!!!
      

  32.   

    查询分析器就是ADOX部分啦。那叫数据库编程,那也是程序来着。
      

  33.   

    数据库字段的增减修改、存储过程、默认值、关系、约束、附加属性等等都是ADOX部分的。如果你不采用三层结构,ADOX可以实现眼花缭乱的功能。以前偶也蛮喜欢用的,尤其是刚从Access转到SQL Server的时候。
      

  34.   

    只用ADODB没有办法递交存储过程的,不信你可以试试。因为存储过程是数据库结构部分的。只能用ADOX操作。偶那个是比较眼晕,但是在ADODB的条件下一句语句实现你说的功能,已经不容易啦。
      

  35.   

    ADODB里边没有IF命令的,你怎么写?写来看看。
      

  36.   

    if month(getdate())=month(getdate()+2) then
          select client_name,birth from clienttable 
                   where month(birth)=month(getdate()) 
                         and day(birth)>=day(getdate())and day(birth)<=day(getdate()+2)
       else
          select client_name,birth from clienttable 
                   where (month(birth)=month(getdate()) and and day(birth)>=day(getdate()))
                   or ((month(birth)=month(getdate()+2) and day(birth)<=day(getdate()+2))这样也不能提交的吗?
      

  37.   

    即使行也是if {}else{}这个格式,SQL语句内部走的C语言格式。
      

  38.   

    呵呵,我前面说了手误,多写了个then
      

  39.   

    试试再说吧,连字符串连接用的+运算都是有的系统能用,有的系统不能用的。只有STUFF是通杀的,反正偶的经验是IF不能用。
      

  40.   

    还有getdate()+2这种语句也是不能用的。
      

  41.   

    你说的两个情况我在SQL查询分析器里是通过的,VB中也可以执行,算了,结贴了~~