求多条件SQL语句

hnymx2005 2008-03-28 10:54:53
有下表:如何取得状态为已签1或交款日期在08年3月份,同时分公司为江苏的客户,结果应为李1、李5、李7、李8、李10
客户姓名   分公司    状态 交款日期
李1    江苏  已签1 08-3-1
李2 山东    已签2  08-4-6
李3     江苏    已签2 08-2-18
李4     安徽    已签1  08-1-6
李5 江苏    已签2  08-3-10
李6 山东    已签1  08-2-19
李7 江苏    已签2 08-3-15
李8 江苏    已签1 08-3-11
李9     江苏    已签2  08-2-1
李10 江苏    已签1 08-3-5
...全文
113 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Limpire 2008-03-29
  • 打赏
  • 举报
回复
如果“交款日期”有索引,1楼的可以利用索引,conver转换之后不能利用索引。

即使没有索引,convert仍然是要耗时的,1楼仅仅是将2008-3-1和2008-4-1两个字串值隐式转换为datetime,当然效率更高。

Aslan_ 2008-03-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Limpire 的回复:]
当然是你的高
[/Quote]
方便解析一下吗?
gggg007 2008-03-29
  • 打赏
  • 举报
回复
select * from tmp where (状态='已签1' or month(交款日期)=3) and 分公司='江苏'
Limpire 2008-03-28
  • 打赏
  • 举报
回复
当然是你的高
hui_hui_2007 2008-03-28
  • 打赏
  • 举报
回复
convert(varchar(6),交款日期,112)='200803'

交款日期 >= '2008-3-1' and 交款日期 < '2008-4-1')

这两种方式哪种效率高呢?

Limpire 2008-03-28
  • 打赏
  • 举报
回复
--> 测试数据: #T
if object_id('tempdb.dbo.#T') is not null drop table #T
create table #T (客户姓名 varchar(4),分公司 varchar(4),状态 varchar(5),交款日期 datetime)
insert into #T
select '李1','江苏','已签1','08-3-1' union all
select '李2','山东','已签2','08-4-6' union all
select '李3','江苏','已签2','08-2-18' union all
select '李4','安徽','已签1','08-1-6' union all
select '李5','江苏','已签2','08-3-10' union all
select '李6','山东','已签1','08-2-19' union all
select '李7','江苏','已签2','08-3-15' union all
select '李8','江苏','已签1','08-3-11' union all
select '李9','江苏','已签2','08-2-1' union all
select '李10','江苏','已签1','08-3-5'

select * from #T where (状态='已签1' or convert(varchar(6),交款日期,112)=200803) and 分公司='江苏'

/*
客户姓名 分公司 状态 交款日期
---- ---- ----- -----------------------
李1 江苏 已签1 2008-03-01 00:00:00.000
李5 江苏 已签2 2008-03-10 00:00:00.000
李7 江苏 已签2 2008-03-15 00:00:00.000
李8 江苏 已签1 2008-03-11 00:00:00.000
李10 江苏 已签1 2008-03-05 00:00:00.000
*/
hui_hui_2007 2008-03-28
  • 打赏
  • 举报
回复

create table tmp (
客户姓名 varchar(5),
分公司 varchar(6),
状态 varchar(6),
交款日期 datetime
)

insert into tmp
select '李1','江苏','已签1','08-3-1' union all
select '李2','山东','已签2','08-4-6' union all
select '李3','江苏','已签2','08-2-18' union all
select '李4','安徽','已签1','08-1-6' union all
select '李5','江苏','已签2','08-3-10' union all
select '李6','山东','已签1','08-2-19' union all
select '李7','江苏','已签2','08-3-15' union all
select '李8','江苏','已签1','08-3-11' union all
select '李9','江苏','已签2','08-2-1' union all
select '李10','江苏','已签1','08-3-5'

select *
from tmp
where 分公司='江苏' and (状态='已签1' or (交款日期 >= '2008-3-1' and 交款日期 < '2008-4-1'))

/*
客户姓名 分公司 状态 交款日期
----- ------ ------ ------------------------------------------------------
李1 江苏 已签1 2008-03-01 00:00:00.000
李5 江苏 已签2 2008-03-10 00:00:00.000
李7 江苏 已签2 2008-03-15 00:00:00.000
李8 江苏 已签1 2008-03-11 00:00:00.000
李10 江苏 已签1 2008-03-05 00:00:00.000

(所影响的行数为 5 行)
*/

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧