【问题标题】:How to use NOT IN or Not Exist custom in Datetime?如何在 Datetime 中使用 NOT IN 或 Not Exist 自定义?
【发布时间】:2012-12-10 17:20:31
【问题描述】:

我使用 2 个表,我希望第一个表而不是表 2 中的数据显示到数据库。

例如 *第一个表“filesTA”*

EmpNo | ChkDate
00001 | 2012-10-01 00:00:00.000
00001 | 2012-10-02 00:00:00.000
00001 | 2012-10-03 00:00:00.000
00001 | 2012-10-04 00:00:00.000
00001 | 2012-10-05 00:00:00.000

“SalaryDay2”

sEmpNo | sDate
00001 | 2012-10-01 00:00:00.000
00001 | 2012-10-02 00:00:00.000

当我选择 2012-10-01 和 2012-10-05 之间的日期时间时

我需要输出:

sEmpNo | sDate
00001 | 2012-10-03 00:00:00.000
00001 | 2012-10-04 00:00:00.000
00001 | 2012-10-05 00:00:00.000

此代码:

SELECT tf.EmpNo,tf.ChkDate
FROM filesTA tf 
WHERE tf.ChkDate NOT IN(
SELECT sd2.sDate
FROM SalaryDay2 sd2
WHERE Convert(nvarchar(10),sd2.sDate,126) Between '2012-10-01' and '2012-10-05'
)

请帮助我。谢谢你的时间。:)

【问题讨论】:

  • 请不要将datetimes 转换为字符串。如果您需要在一侧的字符串和另一侧的 datetime 之间进行比较,请将字符串转换为 datetime 值。在这个特定查询中可能没有太大区别,但将日期视为字符串是日期相关错误的最大来源之一。

标签: sql sql-server sql-server-2008 datetime notin


【解决方案1】:

除非我误解了你的问题,否则你需要这样的东西:

SELECT tf.EmpNo,tf.ChkDate
FROM filesTA tf 
LEFT JOIN SalaryDay2 sd2 ON (sd2.EmpNo = tf.EmpNo AND sd2.ChkDate = tf.ChkDate)
WHERE sd2.EmpNo IS NULL  --you may want to add other condition as well

(来自filesTA的记录,在SalaryDay2中没有相应记录)

【讨论】:

    【解决方案2】:

    BETWEEN是一个包容的东西,基本上归结为

    x BETWEEN a AND b
    

    和一样

    (x >= a) AND (x <= b)
    

    如果我正确阅读了您的示例,您需要一个不包含在内的版本,您必须努力写出来:

    yourdate > '2012-10-01' AND yourdate <= '2012-10-05'
             ^-- note: <, not <=         
    

    【讨论】:

      【解决方案3】:

      使用EXCEPT 子句

      SELECT EmpNo, ChkDate
      FROM filesTA
      EXCEPT
      SELECT sEmpNo, sDate
      FROM SalaryDay2
      WHERE sDate BETWEEN '20121001' and '20121005' 
      

      SQLFiddle上的演示

      【讨论】:

        【解决方案4】:

        您可以为此目的使用NOT EXISTS。它应该根据您的加入标准消除第二个表中不存在的行。

        DECLARE @FirstDate DATE = '2012-10-01'
        DECLARE @SecondDate DATE = '2012-10-05'
        SELECT  *
        FROM    FilesTA
        WHERE   NOT EXISTS ( SELECT 1
                             FROM   SalaryDay2
                             WHERE  SalaryDay2.sDate = FilesTA.ChkDate 
                             -- If you want to check per EmpNo as well uncomment this line:
                             -- AND SalaryDay2.sEmpNo = FilesTA.EmpNo
        )
                AND FilesTA.ChkDate BETWEEN @FirstDate
                                    AND     @SecondDate
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-11
          • 1970-01-01
          • 2018-01-08
          • 1970-01-01
          • 1970-01-01
          • 2017-11-26
          • 1970-01-01
          相关资源
          最近更新 更多