首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 存储过程里执行字符串查询语句,如何传入时间变量 [已结贴,结贴人:xingls]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 15:03:03 楼主
    有人对sqlserver存储过程熟悉的吗,我想问个问题,因为我的查询参数不确定,不能直接查询,需要把datetime类型字段作为变量传入,
    我的测试程序如下:
    create proc dbo.test
                @BeginTime datetime
    as
    begin
        declare @t_sql varchar(500)
        SET NOCOUNT ON
        set @t_sql='select O.object_id,T_LOGIN
                    from R_AGENT_HOUR R,O_AGENT_HOUR O,T_AGENT_HOUR T
                    where R.object_id=O.object_id and R.time_key=T.time_key and T.begin_time <'
        set @t_sql=@t_sql+' and T.begin_time <'
        select @t_sql
        --exec(@t_sql+cast(@BeginTime as varchar))
        exec(@t_sql+@BeginTime)
    end

    但这样,因为@BeginTime变量是日期类型,不能组成字符串直接运行,请问我该怎么解决这个问题,谢谢!
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 15:05:051楼 得分:10
    用convert转成varchar.......
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 15:06:092楼 得分:10
    create proc dbo.test
                @BeginTime datetime
    as
    begin
        declare @t_sql varchar(500)
        SET NOCOUNT ON
        set @t_sql='select O.object_id,T_LOGIN
                    from R_AGENT_HOUR R,O_AGENT_HOUR O,T_AGENT_HOUR T
                    where R.object_id=O.object_id and R.time_key=T.time_key and T.begin_time <'
        set @t_sql=@t_sql+' and T.begin_time <'
        select @t_sql
        --exec(@t_sql+cast(@BeginTime as varchar))
        exec(@t_sql+@BeginTime)
    end


    如果表的字段T.begin_time 是字符类型入20080709,则可以  exec(@t_sql+convert(varchar(8),@BeginTime,112))
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 15:08:413楼 得分:10
    这样?
    SQL code
    alter proc dbo.test @BeginTime datetime as begin declare @t_sql varchar(500) SET NOCOUNT ON set @t_sql='select O.object_id,T_LOGIN from R_AGENT_HOUR R,O_AGENT_HOUR O,T_AGENT_HOUR T where R.object_id=O.object_id and R.time_key=T.time_key and T.begin_time ='''+convert(varchar(20),@BeginTime,120)+'''' exec(@t_sql) end
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 15:09:324楼 得分:10
    T.begin_time 转为convert(varchar(8),T.begin_time,112)
    传的参数转为convert(varchar(8),@BeginTime,112)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 15:10:505楼 得分:10
    类型转化
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 15:14:576楼 得分:10
    引用 3 楼 perfectaction 的回复:
    这样?

    SQL codealter proc dbo.test
                @BeginTime datetime
    as
    begin
        declare @t_sql varchar(500)
        SET NOCOUNT ON
        set @t_sql='select O.object_id,T_LOGIN
                    from R_AGENT_HOUR R,O_AGENT_HOUR O,T_AGENT_HOUR T
                    where R.object_id=O.object_id and R.time_key=T.time_key
                    and T.begin_time ='''+convert(varchar(20),@BeginTime,120)+''…


    就是这样
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 15:17:377楼 得分:20
    SQL code
    create proc dbo.test @BeginTime datetime as begin declare @t_sql varchar(500) SET NOCOUNT ON set @t_sql='select O.object_id,T_LOGIN from R_AGENT_HOUR R,O_AGENT_HOUR O,T_AGENT_HOUR T where R.object_id=O.object_id and R.time_key=T.time_key and T.begin_time <' set @t_sql=@t_sql+' and T.begin_time <'''+ltrim(convert(nvarchar(10),@BeginTime,112))+'''' exec(@t_sql) end
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 15:18:398楼 得分:10
    SQL code
    create proc dbo.test @BeginTime datetime as begin declare @t_sql varchar(500) SET NOCOUNT ON set @t_sql='select O.object_id,T_LOGIN from R_AGENT_HOUR R,O_AGENT_HOUR O,T_AGENT_HOUR T where R.object_id=O.object_id and R.time_key=T.time_key ' --去掉这里的begin_time set @t_sql=@t_sql+' and T.begin_time <'''+ltrim(convert(nvarchar(10),@BeginTime,112))+'''' exec(@t_sql) end
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 15:25:249楼 得分:10



    create table jj
    (dno varchar(10),
    dtime datetime ,
    dmoney money)

    go
    insert into jj
    select '2008010101','2008-01-01',100
    union all
    select '2008010102','2008-01-01',50
    union all
    select '2008010103','2008-01-01',60
    union all
    select '2008010201','2008-01-02',60
    union all
    select '2008010301','2008-01-03',60
    union all
    select '2008010401','2008-01-04',30


    select * from jj
    ------------
    2008010101 2008-01-01 00:00:00.000 100.0000
    2008010102 2008-01-01 00:00:00.000 50.0000
    2008010103 2008-01-01 00:00:00.000 60.0000
    2008010201 2008-01-02 00:00:00.000 60.0000
    2008010301 2008-01-03 00:00:00.000 60.0000
    2008010401 2008-01-04 00:00:00.000 30.0000


    ---------------
    create proc dbo.test
                @BeginTime datetime
    as
    begin
        declare @t_sql varchar(500)
        SET NOCOUNT ON
        set @t_sql='select * from jj where dtime <' + char(39) + convert(varchar(10),@begintime,120) + char(39)
        select @t_sql
        --exec(@t_sql+cast(@BeginTime as varchar))
        exec(@t_sql)
    end


    exec test '2008-01-04'

    ----结果
    select * from jj where dtime <'2008-01-06'

    2008010101 2008-01-01 00:00:00.000 100.0000
    2008010102 2008-01-01 00:00:00.000 50.0000
    2008010103 2008-01-01 00:00:00.000 60.0000
    2008010201 2008-01-02 00:00:00.000 60.0000
    2008010301 2008-01-03 00:00:00.000 60.0000


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 15:27:4910楼 得分:0
    谢谢各位,我先看看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 15:38:5611楼 得分:0
    我已经结了帖子,但刚才忘了说,我的是需要保证时分秒的,ltrim(convert(nvarchar(10),@BeginTime,112))能不能保证?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-09 17:21:5412楼 得分:0
    引用 11 楼 xingls 的回复:
    我已经结了帖子,但刚才忘了说,我的是需要保证时分秒的,ltrim(convert(nvarchar(10),@BeginTime,112))能不能保证?

    不能,那就要调一下112这个数字,
    SQL code
    select convert( nvarchar(20),getdate(),120) /* 2008-07-09 17:21:11 */
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-10 09:39:5313楼 得分:0
    谢谢苦行僧
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved