【发布时间】:2015-05-07 11:42:25
【问题描述】:
我正在尝试开发一个查询来验证用户数据输入,但我被卡住了。基本上,我们正在处理有关每日 24 小时复合水样的信息。用户将输入“COLDATE”,这是合成的结尾,并以 DATETIME 格式存储,如“2015-03-02 04:00:00.000”。然后他们将输入“Compstartdate”,它是 varchar(8),看起来像“03/02/15”。最后,他们将输入“Compstarttime”,它是 varchar(5),看起来像“04:01”。
别怪我,我没有这样设置,让我们假设修复数据类型不是一个选项。
我正在处理的规则是一天的“Compstart(日期/时间)”需要与前一天的“COLDATE”相匹配。到目前为止,我只能弄清楚如何查看“COLDATE(day) - 1 day”是否等于“Compstartdate(day)”。换句话说,我可以轻松地在一条记录中进行逻辑比较,但我不知道如何比较两条记录。
此外,我们只讨论了 2000 条记录,因此性能方面的考虑并不重要,正如我使用案例陈述所证明的那样。我的意思是,涉及游标或 while 循环的解决方案对我来说是完全可以接受的。
这是我目前所拥有的:
SELECT S.[SAMPNO]
,S.[LOCCODE]
,S.[COLDATE]
,U.[Compstartdate]
,U.[Compstarttime]
FROM [dbo].[SAMPLE] as S
JOIN [dbo].[SUSERFLDS] as U
on S.SAMPNO = U.SAMPNO
Where
Case
When DATEPART(DAY, Convert(VARCHAR(10),U.Compstartdate,101)) !=
DATEPART(DAY, DATEADD(DAY, -1, S.COLDATE))
Then 'Yes'
ELSE 'NO'
END ='YES'
编辑:让我试着更好地解释这个问题。如果我今天收集了一个 24 小时的复合样本并将有关样本的信息输入到数据库中,我将输入我收集样本的日期/时间(复合结束)和复合开始的日期/时间.因为它是 24 小时复合,所以今天样本的开始日期/时间应该等于昨天样本的结束时间 (COLDATE)。因此,我需要使用相同的 LOCCODE 但 COLDATE 相隔一天采集两个样本。然后查看较早样本的 COLDATE 是否等于较晚样本的 Compstartdate/time。
编辑 #2:这是一些示例数据。
create table [SAMPLE] (
SAMPNO int,
LOCCODE char(7),
COLDATE datetime
);
create table SUSERFLDS (
SAMPNO int,
Compstartdate char(8),
Compstarttime char(5)
);
SET DATEFORMAT mdy;
insert into [SAMPLE] values (11,'Sample1','2015-03-02 04:00:00.000');
insert into [SAMPLE] values (12,'Sample1','2015-03-03 04:00:00.000');
insert into [SAMPLE] values (13,'Sample1','2015-03-04 04:00:00.000');
insert into [SAMPLE] values (14,'Sample1','2015-03-05 04:00:00.000');
insert into SUSERFLDS values (11, '03/01/15', '04:00');
insert into SUSERFLDS values (12, '03/02/15', '04:00');
insert into SUSERFLDS values (13, '03/03/15', '05:00');
insert into SUSERFLDS values (14, '03/04/15', '04:00');
--Compstartdate/time for SAMPNO 12
--does match COLDATE for SAMPNO 11
--Compstartdate/time for SAMPNO 13
--should match COLDATE for SAMPNO 12
【问题讨论】:
-
“我可以很容易地在一条记录中进行逻辑比较,但我不知道如何比较两条记录。” 你的意思是你可以比较天但也需要比较时间?
-
虽然我确实需要比较日期和时间元素,但这并不是我所说的“比较两条记录”的意思。我的意思是我不知道如何将一天的数据与前一天的数据进行比较,这将在连接表中显示为单独的记录/行。
-
我假设它是 SQL Server。什么版本?
-
是SQL server 2008。
-
您知道
Compstartdate和Compstarttime是否总是有效值(有效日期和有效时间)?如果您可以假设它们会正确转换,那就会有所不同。
标签: sql sql-server-2008 while-loop cursor logic