SQL> =和< =在IIF或WHERE中出错

时间:2017-12-21 19:01:58

标签: sql-server date comparison iif operationalerror

我在两个表之间有一个交叉连接,我需要一组条件的PayrollOID。我已经尝试在WHERE子句中的CASE语句,CASE和IIF语句中执行此操作,现在在常规代码中实现我将不得不做另一个传递来摆脱空白。

根据批准日期,我有工作批准转到工资单。我们正在将其更改为输入批准的日期。

如果Apr_Entered是> = JobPayStart和Apr_Entered< = TimesheetsDue和JobEndDate> = JobPayStart和JobEndDate< = JobPayEnd - 给我那个OID。不要寻找其他任何东西。

否则 - 我希望在Apr_Entered为> = JobPayStart和Apr_Entered< = JobPayEnd的情况下支付工作。

我收到错误:函数参数列表出错:'>'未识别。无法解析查询文本。

但确实有效。然而,我正在获得重复项,其中两个括号都显示为重叠作业。

我需要帮助收紧我的书挡 - 所以当第一次被发现时就会离开。我还需要知道为什么在将datetime字段转换为Date以进行比较时仍然会出现错误。

IIF(CONVERT(varchar(10), ProtoPayroll.AprEntered,110) >= CONVERT(varchar(10), PayDates.PayStartDate,110)
AND CONVERT(varchar(10), ProtoPayroll.AprEntered,110) <= CONVERT(varchar(10), PayDates.TimesheetsDue,110)
AND CONVERT(varchar(10), ProtoPayroll.JobEndDate,110) >= CONVERT(varchar(10), PayDates.PayStartDate,110)
AND CONVERT(varchar(10), ProtoPayroll.JobEndDate,110) <= CONVERT(varchar(10), PayDates.PayEndDate,110), 
    --First IIF's result
    CONVERT(nvarchar(40), dbo.Paydates.OID),
    --Now another IIF
    IIF (CONVERT(varchar(10), ProtoPayroll.AprEntered,110) >= CONVERT(varchar(10), PayDates.PayStartDate,110)
    AND CONVERT(varchar(10), ProtoPayroll.AprEntered,110) <= CONVERT(varchar(10), PayDates.PayEndDate,110),
    --Second IIF's results
    CONVERT(nvarchar(40), dbo.Paydates.OID), SPACE(40))) AS PayrollOID

1 个答案:

答案 0 :(得分:0)

这里有很多猜测工作,但SQL需要整洁。我看不出你的SQL有什么问题,&#34; per-say&#34;但你通过将日期转换为varchar来解决问题。例如,在varchar中,'11/11/2016'日期 AFTER 01/01/2018'是的,那是对的,我说过了。这是因为1&gt; 0(varchar的第一个字符首先用于排序,然后用于第二个等,等等。)

无论如何,这是一个更整洁的SQL版本,而是使用CASE表达式。显然,这是完全未经测试的。您真正需要做的是发布一些Sample数据,DDL和您期望的结果集。你实际上并没有在这里问一个问题,你只是告诉我们你的目标并说出你的错误(我们无法复制)。

SELECT CASE WHEN PP.AprEntered >= PD.PayStartDate
             AND PP.AprEntered <= PD.TimesheetsDue
             AND PP.JobEndDate >= PD.PayStartDate
             AND PP.JobEndDate <= PD.PayEndDate THEN CONVERT(nvarchar(40), PD.OID)
            WHEN PP.AprEntered >= PD.PayStartDate
             AND PP.AprEntered <= PD.PayEndDate THEN CONVERT(nvarchar(40), PD.OID)
            ELSE SPACE(40)
       END AS YourColumn
FROM ProtoPayroll PP 
     JOIN PayDates PD ON --JOIN Criteria
WHERE ...;

如果这对您没有帮助,请查看http://sqlfiddle.com/#!9/53d3c/52/0