[英]SQL Server : not inserting date when date is already present in table
基本上,我不希望用户在表中插入过去已经插入的日期。
我的查询在以下情况下有效,但在一种情况下,它会失败,在查询中,我返回一个整数值(如果该值大于0),那么我不允许用户输入日期。
在数据库中,已插入的日期为:
以下情况
Start Date End Date
Case 1) 1 march 2016 23 march 2016 working
Case 2) 1 june 2016 15 june 2016 working
Case 3) 15 april 2016 15 may 2016 NOT working
日期时间格式为: yyyy-mm-dd hh:mm:ss
这是我的查询
SELECT
COUNT(1) AS [A1]
FROM
[dbo].[CandidateExperience]
WHERE
([CandidateID] = 50)
AND ([CandidateExperienceID] <> 118)
AND ([DeletedBy] IS NULL)
AND (NOT ((('2015-04-15 00:00:00' <[StartDate]) OR ('2015-04-15 00:00:00' > [EndDate]))
OR (('2015-04-30 00:00:00' > [EndDate]) OR ('2015-04-30 00:00:00'< [StartDate]))))
您的OR
逻辑有些混乱。 当您将它们放在NOT
它的结尾将意味着,如果其中任何一个为true,则整个事件将被评估为false-这意味着您将不会获得任何行。 我也不确定为什么要检查日期,因为它们与测试用例中的日期不匹配。
相反,请尝试:
SELECT
COUNT(1) AS A1
FROM
dbo.CandidateExperience
WHERE
CandidateID = 50 AND
CandidateExperienceID <> 118 AND -- Good old ID 118
DeletedBy IS NULL AND
(
('2015-04-15 00:00:00' > StartDate AND '2015-04-15 00:00:00' < EndDate) OR
('2015-05-15 00:00:00' > StartDate AND '2015-05-15 00:00:00' < EndDate) OR
('2015-04-15 00:00:00' = StartDate AND '2015-05-15 00:00:00' = EndDate)
)
这是使用子查询的另一种方法,因此您可以定义现有记录的日期范围,并确认没有记录在该范围内。
SELECT
COUNT(1) AS [A1]
FROM [dbo].[CandidateExperience] C
WHERE ([CandidateID] = 50)
AND ([CandidateExperienceID] <> 118)
AND ([DeletedBy] IS NULL)
AND NOT EXISTS (
SELECT *
FROM (
SELECT CONVERT(DATE, '4/1/2016') AS [D1], CONVERT(DATE, '4/30/2016') AS [D2]
UNION ALL SELECT CONVERT(DATE, '5/1/2016') AS [D1], CONVERT(DATE, '5/31/2016') AS [D2]
) Existing (StartDate, EndDate)
WHERE (C.StartDate <= Existing.EndDate AND C.EndDate >= Existing.StartDate)
-- Assumes C.StartDate <= C.EndDate and that C.StartDate and C.EndDate do not have times (all 12am)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.