如何在mssql中实现查询一个月前的记录
数据库里的记录时间的表现使用varchar类型的。各个记录格式如下:
11-6月 -06
12-5月 -06
16-2月 -06
16-3月 -06
16-3月 -06
16-4月 -06
16-6月 -06
17-5月 -06
27-5月 -06

解决方案 »

  1.   

    Select * From TableName Where Substring(時間字段,CharIndex('-',時間字段)+1,CharIndex(N'月',時間字段)-CharIndex('-',時間字段)-1)  =Month(GetDate())-1
      

  2.   

    如何在mssql中实现查询一个月前的记录
    数据库里的记录时间的表现使用varchar类型的。各个记录格式如下:
    11-6月 -06
    12-5月 -06
    16-2月 -06
    16-3月 -06
    16-3月 -06
    16-4月 -06
    16-6月 -06
    17-5月 -06
    27-5月 -06
    select * from tb where substring(时间,4,1)=dateadd(month,-1,getdate())
      

  3.   

    2楼的写法比较简洁,但是忽略了年份,因为数据有可能是05年的.SELECT * FROM tb WHERE DATEDIFF(m,dbo.LawDate(yourdate),GETDATE())=1--定义一个生成合法日期格式的函数
    CREATE FUNCTION LawDate(@dt CHAR(20))
    RETURNS DATETIME
    AS
    BEGIN DECLARE @y INT,@m INT,@d INT,@dt1 CHAR(20),@rd CHAR(20)
    SET @dt1=REPLACE(@dt,'月 ','')
    SET @d=LEFT(@dt1,CHARINDEX('-',@dt1)-1)
    SET @m=LEFT(REPLACE(@dt1,RTRIM(@d) + '-',''),CHARINDEX('-',REPLACE(@dt1,RTRIM(@d) + '-',''))-1)
    SET @y=REPLACE(REPLACE(@dt1,RTRIM(@d) + '-',''),RTRIM(@m) + '-','')
    SET @rd=RTRIM(@y) + '-' + RTRIM(@m) + '-' + RTRIM(@d)
    RETURN CAST(@rd AS DATETIME)
    END
      

  4.   

    select * from tablename where Month(cast(时间 as datetime)) = Month(GetDate()) - 1
      

  5.   

    select * from tablename where Month(cast(时间 as datetime)) = Month(GetDate().DateAdd(mm, -1))
      

  6.   

    Month(GetDate().DateAdd(mm, -1))  :)
      

  7.   

    不能直接用CAST或CONVERT转换,他的日期不合法
      

  8.   

    paoluo(一天到晚游泳的鱼) ( ) 信誉:100  2006-06-16 14:28:00  得分: 0  
     
     
       Month(GetDate().DateAdd(mm, -1))  :)
    ----------------------
      
     
    没看懂.不好意思.是SQL2005中的语法吗?
    另外这样写的话,也仅仅只是用Month与字段中的月份比较,无法区别是1月还是13月或是25月
      

  9.   

    加上年的話。Select * From TableName Where Substring(時間字段,CharIndex('-',時間字段)+1,CharIndex(N'月',時間字段)-CharIndex('-',時間字段)-1)  =Month(GetDate())-1 And Right(時間字段,2)=Right(Year(GetDate()),2)
      

  10.   

    fcuandy(www.iaspnet.com)這不是我寫的,我是指出他的語句的問題,先看看我那個回復上面的回復。應該是把C#和SQL混在一起了吧,不象是SQL的寫法。
      

  11.   

    这下没问题了.
    写着都忘了,在函数里写的麻烦了,把RIGHT都忘了..
      

  12.   

    e.这下没问题了.我的函数里写的麻烦了,写的时候RIGHT都忘记了..
      

  13.   

    问题是我要从一张
    vio的表中取得这个表的最近的日期,然后要从这个日期开始先前推算出一个月,把结果查询出来
    记录日期的字段名称为gxsj.上面已经说过这个字段是varchar类型的不是datetime类型的.例如
    [gxsj]
    11-6月 -06
    12-5月 -06
    16-2月 -06
    16-3月 -06
    16-3月 -06
    16-4月 -06
    16-6月 -06
    17-5月 -06
    27-5月 -06
      

  14.   


    Declare @Dt DateTime
    Select @Dt =Max(日期) From vio 
    Select * From TableName Where Substring(時間字段,CharIndex('-',時間字段)+1,CharIndex(N'月',時間字段)-CharIndex('-',時間字段)-1)  =Month(@Dt)-1 And Right(時間字段,2)=Right(Year(@Dt),2)
      

  15.   

    Declare @Dt DateTime
    Select @Dt =Max(gxsj) From vio_cx 
    Select * From vio_cx Where Substring(gxsj,CharIndex('-',gxsj)+1,CharIndex(N'月',gxsj)-CharIndex('-',gxsj)-1)  =Month(@Dt)-1 And Right(gxsj,2)=Right(Year(@Dt),2)
    服务器: 消息 241,级别 16,状态 1,行 2
    从字符串转换为 datetime 时发生语法错误。
    !!!
      

  16.   

    vio表中的時間字段不是DateTime類型的??
    那是怎樣的??也是“27-5月 -06”這種格式嗎??
      

  17.   

    沒辦法了,寫函數吧。
    Create Function GetTime(@S Nvarchar(20))
    Returns DateTime
    As
    Begin
    Return Cast(Right(@S,2)+Right(100+Substring(@S,CharIndex('-',@S)+1,CharIndex(N'月',@S)-CharIndex('-',@S)-1) ,2)+Left(@S,2) As DateTime)
    End
    GO
    Declare @Dt DateTime
    Select @Dt =Max(dbo.GetTime(日期)) From vio 
    Select * From TableName Where Month(dbo.GetTime(時間字段)) =Month(@Dt)-1 And  Year(dbo.GetTime(時間字段)) =Year(@Dt)-1
      

  18.   

    為什麼不直接用DateTime做類型??或者說在存入數據庫時存入可以轉為時間型的字符串呢??這樣是可以實現,但是效率不高。上面有點問題,改下。Create Function GetTime(@S Nvarchar(20))
    Returns DateTime
    As
    Begin
    Return Cast(Right(@S,2)+Right(100+Substring(@S,CharIndex('-',@S)+1,CharIndex(N'月',@S)-CharIndex('-',@S)-1) ,2)+Left(@S,2) As DateTime)
    End
    GO
    Declare @Dt DateTime
    Select @Dt =Max(dbo.GetTime(日期)) From vio_cx 
    Select * From vio_cx Where Month(dbo.GetTime(時間字段)) =Month(@Dt)-1 And  Year(dbo.GetTime(時間字段)) =Year(@Dt)