【问题标题】:SQL Server : not inserting date when date is already present in tableSQL Server:当日期已经存在于表中时不插入日期
【发布时间】:2016-04-22 12:16:23
【问题描述】:

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

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

【问题讨论】:

  • 发布你尝试过的查询
  • 获取最小开始日期和最大结束日期,并使用这两个值进行比较。
  • Mukund先生可以修改上面的查询
  • 嗨@MayurSingh,您不需要打电话给我们先生,您知道...

标签: sql sql-server


【解决方案1】:

您的OR 逻辑有点混乱。当你在NOT 中有这些时,它最终意味着如果其中任何一个为真,那么整个事情将被评估为假 - 这意味着你不会得到任何行。我也不确定您为什么要检查您所在的日期,因为它们与您的测试用例中的内容不匹配。

请尝试:

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

【讨论】:

  • Hi @Tom H 以上查询返回我 0 日期开始日期:2015 年 4 月 1 日和结束日期:2015 年 4 月 30 日。这些日期存在于表中
  • 但是 2015 年 4 月 15 日作为开始日期和 2015 年 5 月 15 日作为结束日期工作正常
  • 我想这带来了一个重要的问题。应该允许日期的哪一端等于下一个或上一个范围?例如,一个范围是在下一个范围的开始处结束还是应该在前一天(或一毫秒前)结束?我假设两端都可以匹配每一侧的范围并适当地修复查询。
  • 基本上我将 DateTime 数据类型列中的时间设为 00:00:00。即开始日期:2015-04-01 00:00:00.000 和结束日期:2015-04- 30 00:00:00.000。用户不允许插入 2015 年 4 月 1 日和 2015 年 4 月 30 日的日期,因为它们已经存在
【解决方案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)
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多