Sql 比较DATETIME和DATE忽略时间部分

Sql 比较DATETIME和DATE忽略时间部分,sql,sql-server,tsql,sql-server-2008,datetime-conversion,Sql,Sql Server,Tsql,Sql Server 2008,Datetime Conversion,我有两个表,其中列[date]的类型为DATETIME2(0) 我必须只比较两个记录的日期部分(天+月+年),丢弃时间部分(小时+分钟+秒) 如何执行此操作?使用SQL Server 2008中新的日期数据类型的转换来比较日期部分: IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE) Marc回答中的一个小缺点是两个日期字段都已进行了类型转换,这意味着您将无法利用任何索引 因此,如果需要编写一个可以从日期字段的索引中获益的查询,那么下面

我有两个表,其中列
[date]
的类型为
DATETIME2(0)

我必须只比较两个记录的日期部分(天+月+年),丢弃时间部分(小时+分钟+秒)


如何执行此操作?

使用SQL Server 2008中新的
日期
数据类型的
转换来比较日期部分:

IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)

Marc回答中的一个小缺点是两个日期字段都已进行了类型转换,这意味着您将无法利用任何索引

因此,如果需要编写一个可以从日期字段的索引中获益的查询,那么下面的方法(相当复杂)是必要的

  • 索引日期字段(称为DF1)必须不被任何类型的函数触及
  • 因此,您必须将DF1与DF2当天的全部datetime值进行比较
  • 也就是从DF2的日期部分到DF2后一天的日期部分
  • 也就是说,
    (DF1>=CAST(DF2作为日期))和(DF1

  • 注意:非常重要的一点是将=(允许相等)与DF2日期进行比较,以及(严格地)将两个日期(如MM/DD/YYYYMM/DD/YYYY进行比较。 请记住,字段的第一个列类型必须是dateTime。 示例:columnName:payment\u date数据类型:DateTime。

    之后,你可以很容易地比较它。 查询是:

    select  *  from demo_date where date >= '3/1/2015' and date <=  '3/31/2015'.
    

    选择*from demo_date,其中date>=“2015年3月1日”和date,尽管我对标记为正确的答案进行了投票。我想为任何碰到这个问题的人谈几件事

    一般来说,如果只针对日期值进行筛选。Microsoft建议使用与语言无关的格式
    ymd
    y-m-d

    请注意,表格“2007-02-12”仅被视为与语言无关 对于数据类型DATE、DATETIME2和DATETIMEOFFSET

    使用上述方法进行日期比较很简单。考虑下面的设计实例:

    --112 is ISO format 'YYYYMMDD'
    declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
    
    select 
        * 
    from 
        Sales.Orders
    where
        CONVERT(char(8), OrderDate, 112) = @filterDate
    
    在理想情况下,应该避免对筛选列执行任何操作,因为这会阻止SQL Server高效地使用索引。也就是说,如果你所存储的数据只涉及日期而不是时间,考虑以午夜为时间存储为<代码>日期时间<代码>。因为:

    当SQL Server将文本转换为筛选列的类型时,它 假设未指示时间部分时为午夜。如果你想要这样一个 filter要返回指定日期后的所有行,需要确保 以午夜为时间存储所有值

    因此,假设您只关心日期,并存储数据。上述查询可简化为:

    --112 is ISO format 'YYYYMMDD'
    declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
    
    select 
        * 
    from 
        Sales.Orders
    where
        OrderDate = @filterDate
    
    你可以试试这个

    CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000')
    
    我通过以下代码对MS SQL 2014进行了测试

    select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok'
                else '' end
    

    您可以使用
    DateDiff
    并按天进行比较

    DateDiff(dd,@date1,@date2) > 0
    
    它的意思是
    @date2>@date1

    例如:

    select DateDiff(dd, '01/01/2021 10:20:00', '02/01/2021 10:20:00') 
    

    结果是:1

    这并不能完全回答问题。它查询一个月,而不是一天。对于您的三月查询:如果日期是“2015年3月31日”时间13:00,则将找不到它。你应该使用“4/1/2015”,也可以考虑使用国际日期格式“2015-03-01”。在加拿大(和许多其他地方),官方格式是DD/MM/YYYY,这使得两种格式都模棱两可且有问题。这个答案不涉及问题中要求的两个表格。是的,我同意,但我只是证明解决方案而不是国际解决方案。。你必须改变一些顺序。。。