【问题标题】:check date between fdate and tdate if its there load seprate table in sql server检查日期和日期之间的日期,如果它在sql server中加载单独的表
【发布时间】:2015-04-08 05:48:41
【问题描述】:

你好朋友我对sql server有一点疑问请告诉我如何解决 表: patient: pid | Date | Name 100 | 2015-01-01 |Abc 101 | 2015-02-20 |banu 102 |2015-03-14 |hari

`

Address:

Pid  |   Fromdate  |  ToDate     |  Address
100  |  2014-12-31 | 2015-02-01  |   Hyd
101  | 2015-02-20  |2015-02-20   |   Bang
102  |  2015-04-10 |2015_05_20   |   Chen`

根据上表,我想在地址表中检查从日期到今天之间的患者日期。 如果患者日期介于 fromdate 和 todate 在地址中,我想加载单独的临时表 在 tempresult 表中,我只需要患者的姓名列,并且为了识别该记录添加一个 列状态。 f 患者日期不在 fromdate 和 todate 之间 在 tempresult 表中。 Finaly Temp 表结果如下所示:

Tablesname :##TempResult

Name |  Status
Abc  | Outdate
banu | Indate
hari | outdate

我尝试如下

alter procedure test
as

begin

IF

OBJECT_ID('tempdb..##Result') IS NOT NULL
drop

table ##Result
create

table ##Result
(

Name

varchar(50),
Filter

varchar(10)
)

insert

into ##result
select

a.name, 'InDate' as Filter from patient a join address b on a.patientnumber=b.patientnumber
where

a.date <=b.fromdate and a.date >=b.todate
insert into ##result
select

a.name, 'outDate' as Filter from patient a join address b on a.patientnumber=b.patientnumber
where

a.date <>b.fromdate and a.date <>b.todate
select * from  ##result
end
exec test 

select * from  ##result

它给出了正确的值。但性能方面它不是好方法 到期记录检查 2 次(全部记录)请告诉我任何其他方式 达到这个问题。 我尝试过的另一种方式

alter procedure [dbo].[FindDate]
as
begin
 IF OBJECT_ID('tempdb..##Address') IS NOT NULL
drop table ##Address
create table ##Address
(
id int identity(1,1),
patientnumber int,
fromdate date,
Todate date,
Address varchar(50)
)
IF OBJECT_ID('tempdb..##Result') IS NOT NULL
drop table ##Result
create table ##Result
(
Name varchar(50),
Filter varchar(10)
)

insert into ##Address 
select patientnumber,fromdate,todate,address from Address
----------------------------------------------------

declare @acount int
select @acount=count(id) from ##Address


declare @i int
set @i=1

while @i<=@acount
begin

declare @pn int,@fromdate date,@todate date,@address varchar(50)

select @pn=patientnumber,@fromdate=fromdate,@todate=Todate from ##Address 
where id=@i
set @i=@i+1
end

declare @bcount int
declare @in int
set @in=1

while @i<=@bcount
begin
select @bcount=count(1) from patient

where patientnumber=@pn and [patient].[date] between @fromdate and @todate

if @bcount<>0

begin
insert into ##Result
select name,'InDate' as Filter from patient
where patientnumber=@pn
end
 else
print '4'
begin
insert into ##Result
select name,'OutDate' as Filter from patient
where patientnumber=@pn
end

---set @i=@i+1;
select * from ##Result
end
end

这个结果不好,需要更多时间来记录 3 条记录。 请告诉我如何在 sql server 中解决这个问题。

【问题讨论】:

    标签: sql-server sql-server-2008 sql-server-2012


    【解决方案1】:

    这种方法有很多地方会引起我的疑问,但为了简洁起见,我只会展示一些小的改进来帮助您继续前进。

    首先,示例地址表缺少 PK,这通常是个坏主意,当行数增加时,它可能真的会影响性能。在这个特定的示例中,它并没有真正改变任何东西,但留下这样的差距可能会在以后伤害你。 (或者也许你只是把它留给样本,我不知道)。无论如何,这将解决问题:

    ALTER TABLE [dbo].[Address] ADD [aid] INT IDENTITY(1,1) PRIMARY KEY NOT NULL; 
    

    无论PK如何,您当前的计划都是这样的: 它并不漂亮。对于一些相当简单的事情,它包含许多操作的方式,当数据量增加时,性能可能真的很糟糕。除了查看大局和更改数据模型等之外,还有一个简单的步骤可以通过更改过程来帮助您:

    IF OBJECT_ID(N'[dbo].[test]', 'P') IS NOT NULL
        BEGIN
            DROP PROCEDURE [dbo].[test];
        END;
    GO 
    CREATE PROCEDURE [test]
    AS
        BEGIN
            IF OBJECT_ID('tempdb..##Result') IS NOT NULL
                DROP
    TABLE [##Result];
            CREATE
    TABLE [##Result]
                (
                  [Name] VARCHAR(50) ,
                  [Filter] VARCHAR(10)
                );
    
            INSERT  INTO [##Result]
                    SELECT  [a].[Name] ,
                            CASE WHEN [a].[Date] <= [b].[Fromdate]
                                      AND [a].[Date] >= [b].[ToDate] THEN 'InDate'
                                 WHEN [a].[Date] <> [b].[Fromdate]
                                      AND [a].[Date] <> [b].[ToDate] THEN 'outDate'
                            END AS [Filter]
                    FROM    [dbo].[patient] [a]
                            JOIN [dbo].[Address] [b] ON [a].[pid] = [b].[Pid];
    
            SELECT  *
            FROM    [##Result];
        END;
    

    这给出了以下计划: 如您所见,这一步少了很多,应该会在一定程度上提高性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      相关资源
      最近更新 更多