SQL Server:当表中已存在日期时,不插入日期

时间:2016-04-22 12:16:23

标签: sql sql-server

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

我的查询在下面的情况下工作,但在一种情况下它会失败,并且在查询中我返回一个整数值,如果它大于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]))))

2 个答案:

答案 0 :(得分:4)

你的source('script.R')逻辑有点搞砸了。当你拥有OR中的那些时,它最终意味着如果其中任何一个为真,那么整个事物将被评估为假 - 这意味着你不会得到任何行。我也不确定你为什么要查看你的日期,因为它们与你的测试用例不符。

相反,请尝试:

NOT

答案 1 :(得分:2)

这是另一种使用子查询的方法,因此您可以定义现有记录的日期范围,并确认所有记录都不在该范围内。

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)
    )