繁体   English   中英

SQL Server:如果表中已经存在日期,则不插入日期

[英]SQL Server : not inserting date when date is already present in table

基本上,我不希望用户在表中插入过去已经插入的日期。

我的查询在以下情况下有效,但在一种情况下,它会失败,在查询中,我返回一个整数值(如果该值大于0),那么我不允许用户输入日期。

在数据库中,已插入的日期为:

  • 开始日期:2016年4月1日,结束日期:2016年4月30日
  • 开始日期:2016年5月1日,结束日期:2016年5月31日

以下情况

            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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM