Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 仅检查日期时间字段的日期部分_Sql_Sql Server 2005_Tsql - Fatal编程技术网

Sql 仅检查日期时间字段的日期部分

Sql 仅检查日期时间字段的日期部分,sql,sql-server-2005,tsql,Sql,Sql Server 2005,Tsql,我有一个类似这样的问题: SELECT .. FROM ... WHERE ... AND ISNULL(ICA.actual_appearance_date, ICA.scheduled_appearance_date) BETWEEN LO.order_start_date AND ISNULL(LO.actual_expiry_date, LO.expected_expiry_da

我有一个类似这样的问题:

SELECT ..
        FROM ...
        WHERE ...
        AND ISNULL(ICA.actual_appearance_date, ICA.scheduled_appearance_date)  
            BETWEEN LO.order_start_date 
                AND ISNULL(LO.actual_expiry_date, LO.expected_expiry_date)
是否有一种简洁的方法只检查实际的外观日期在开始日期和结束日期之间,而不包括时间

因此:

出席日期为2011年10月3日14时00分。。。我们检查的日期是2011年10月3日15时和2011年10月7日10时

目前,由于时间因素,这不会产生结果。我只需要在约会部分做一个中间环节。。。所以,在2011年10月3日凌晨0点到2011年10月8日凌晨0点之间

有没有一个简洁的方法可以做到这一点

编辑:

我们正在开发2008年的机器,但我们正在开发2005年的机器。说来话长,但我不能用漂亮整洁的约会方式

我正在尝试DATEADD方法,但发现了一个问题

这并没有返回我期望的结果:

DECLARE  @Table TABLE
(
    StartDate DATETIME,
    EndDate DATETIME
)

INSERT INTO @Table VALUES ('02-Jan-2011 13:00:00', '07-Jan-2011 15:30:00')

SELECT * FROM @Table
DECLARE @Date DATETIME
SET @Date = '07-Jan-2011 16:00:00'

SELECT
    CASE WHEN 
        @Date BETWEEN DATEADD(dd,DATEDIFF(dd,0,StartDate),0) AND DATEADD(dd, DATEDIFF(dd,0,EndDate),0)-- must cover the appearance date or still open
    THEN 1
    ELSE 0
    END AS Result
FROM @Table

我必须在两个日期之间添加+1以包括最后一个日期吗?”“介于”似乎不包括最后日期。

您可以使用转换过程,然后比较:

Convert(Datetime,Convert(Varchar,OrderDate,106),110) 

您使用的是SQL Server 2008,因此只需强制转换到最新版本即可

SELECT .. 
FROM ... 
WHERE ... AND 
     CAST(ISNULL(ICA.actual_appearance_date, ICA.scheduled_appearance_date) AS date)
        BETWEEN
           CAST(LO.order_start_date AS date)
        AND 
           CAST(ISNULL(LO.actual_expiry_date, LO.expected_expiry_date) AS date)
对于SQL Server 2005及更早版本,请使用DATEDIFF/DATEADD技巧:

不要使用varchar或float转换

编辑:,对于SQL Server 2005

您需要将DATEADD/DATEDIFF应用于所有值


这看起来比VARCHAR补丁安全得多。因为我们使用的是内置的数据类型——SQL不在乎它是DMY还是MDY,对吗?还有,我说的对吗,因为我们使用的是介于之间的数据类型,所以第二个日期应该加上一天?因此,和CASTISNULLLO.actual_Expiration_date,LO.expected_Expiration_date作为日期应该添加1天,否则它将不包括这一天?@cdotlister:正确,我们使用本机日期?时间格式,因此语言等不相关。您不需要添加一天,因为BETWEEN is inclusive>=并且由于2008/2005的问题,我不得不修改我的初始帖子。基本上,我们有一个疯狂的情况,我们在生产和UAT中为2008服务器编码-但我们所有的开发服务器都是。。。2005! 我知道-升级他们!但这是政府,事情进展缓慢。。。所以我不能用日期。希望您能提供帮助。@cdotlister:您需要对所有值运行dateadd/datediff。我的原始答案对所有值都有影响,但你的更新没有。
...
SELECT
    CASE WHEN 
         DATEADD(dd,DATEDIFF(dd,0,@Date),0)
              BETWEEN DATEADD(dd,DATEDIFF(dd,0,StartDate),0)
              AND DATEADD(dd, DATEDIFF(dd,0,EndDate),0)
    THEN 1
    ELSE 0
    END AS Result
FROM @Table
WHERE ... AND 
     DATEADD(dd,DATEDIFF(dd,0,ISNULL(ICA.actual_appearance_date, ICA.scheduled_appearance_date),0)
        BETWEEN
           DATEADD(dd,DATEDIFF(dd,0,LO.order_start_date),0)
        AND 
           DATEADD(dd,DATEDIFF(dd,0,ISNULL(LO.actual_expiry_date, LO.expected_expiry_date),0)