【问题标题】:Date parameters returning values outside the range of dates返回日期范围之外的值的日期参数
【发布时间】:2017-07-11 11:39:46
【问题描述】:

使用 SQL Server Management Studio,我有一个使用日期参数的查询,但是当我执行查询时,我看到了不在所选日期范围内的行。

DECLARE @StartDate Date = '7/10/2017'
DECLARE @EndDate Date = '7/17/2017'

SELECT DISTINCT 
    PROJECTID, 
    ACTIVITYID, ACTIVITYNAME, 
    ISPRIMARYRESOURCE, RESOURCEID,
    STARTDATE, FINISHDATE,
    FORMAT(STARTDATE,'dddd') + ', ' + FORMAT(STARTDATE,'m') + ', ' +  
    FORMAT(STARTDATE,'yyyy') AS ES_FORMATTED
FROM 
    Primavera_ODS.TASKRSRCX
WHERE 
    PROJECTID IN ('ONLINE', 'ESR01', 'H-ONL-Active', 'HNP-NBKRRPLD', 'HNP-RVH-LIV',
                  'HNP-CSCR-LIV', 'HNP-TCS-LIV', 'HNP-LPT-LIV', 'HNP-DICSP-LIV',
                  'HNP-NRRVHE', 'HNP-IDS-LIV')
    AND FINISHDATE >= @StartDate 
    AND STARTDATE < @EndDate
ORDER BY 
    STARTDATE

STARTDATEFINISHDATE 字段被格式化为日期时间。

执行查询时,第一行显示 STARTDATE 为 2012-11-01 08:00:00.000,FINISHDATE 为 2018-09-27 17:00:00.000。显然不在声明的日期范围内。

我做错了什么?

【问题讨论】:

  • 请发帖minimal reproducible example。 “最小”意味着去掉不相关的部分,就像所有与PROJECTID 相关的废话。 “可验证”是指包括CREATE TABLE 语句和示例数据(在INSERT INTO 语句的来源中),以便我们可以准确地看到您的查询产生了哪些意外结果。
  • 最好表明这些答案是否有助于解决您的问题以及它们的作用。

标签: sql-server datetime


【解决方案1】:
DECLARE @StartDate Date = '7/10/2017'

这是 2017 年 10 月 7 日还是 2017 年 7 月 10 日?

不管怎样

FINISHDATE >=@StartDate and STARTDATE < @EndDate

意思

'2018-09-27' >= '2017-07-10' AND '2012-11-01' < '2017-07-17'

两个条件都成立

你是这个意思吗?

STARTDATE < @StartDate AND @EndDate <= FINISHDATE

【讨论】:

  • 现在是 7 月 10 日和 7 月 17 日。那么如何编写查询以获取所选范围内的数据?
  • 下面分别查看 Peter Smith 和我的回答。
【解决方案2】:

您需要测试两个日期都在界限内,所以:

@StartDate BETWEEN STARTDATE  AND FINISHDATE 
AND
@EndDate  BETWEEN STARTDATE  AND FINISHDATE 

您可能还需要:

AND
@StartDate < @EndDate

您也可以将日期写成'17-July-2017''2017-07-17' 以避免任何歧义。

【讨论】:

    【解决方案3】:

    如果你的 SQL 和上面的一样,那就没什么问题了。

    您的标准是 FINISHDATE &gt;= @StartDate@StartDate 是“7/10/2017”。从FINISHDATE = '2018-09-27 17:00:00.000' 得到的结果,很明显FINISHDATE > @startDate

    条件还说STARTDATE &lt; @EndDate@EndDate 设置为 '7/17/2017' 并且您返回 STARTDATE = '2012-11-01 08:00:00.000',这是真的。

    我的假设是您的日期范围应该在@StartDate@EndDate 之间?如果这是正确的,也许您可​​以尝试以下方法:

    AND 
    FINISHDATE BETWEEN @StartDate AND @EndDate
    AND
    STARTDATE BETWEEN @StartDate AND @EndDate
    

    尼尔斯

    【讨论】:

      【解决方案4】:

      你是完全正确的 gbn。我已接受查询参数,结果按要求返回数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 2021-07-01
        • 2022-11-23
        相关资源
        最近更新 更多