Compare DATETIME and DATE ignoring time portion
我有两个表WHERE column
我只想把他们两个在约会记录部件(日+月+年)discarding时间(小时,分钟,秒+配件+)。
我该如何做?
在SQL Server 2008中,使用
1 | IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE) |
Marc回答的一个小缺点是两个日期字段都已被排版,这意味着您将无法利用任何索引。
因此,如果需要编写一个可以从日期字段上的索引中获益的查询,那么就必须使用以下方法(相当复杂)。
- 索引日期字段(称为df1)必须不受任何类型的函数的影响。
- 因此,您必须将df1与df2当天的日期时间值的完整范围进行比较。
- 这是从df2的日期部分到df2之后一天的日期部分。
- 即
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE))) 。 - 注:非常重要的一点是,比较是>=(允许相等)到df2的日期,并且(严格地)
ps:另一种仅提取日期的方法(在旧版本的SQL Server中)是使用一个技巧,说明如何在内部表示日期。
- 把日期铸成浮点数。
- 截断小数部分
- 将值强制转换回日期时间
- 即
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME) 。
尽管我投了反对票,但答案是正确的。我想为任何一个跌跌撞撞的人谈一些事情。
一般来说,如果您只是专门过滤日期值。微软建议使用与语言无关的
Note that the form '2007-02-12' is considered language-neutral only
for the data types DATE, DATETIME2, and DATETIMEOFFSET.
号
使用上述方法进行日期比较很简单。考虑下面这个人为的例子。
1 2 3 4 5 6 7 8 9 | --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有效地使用索引。也就是说,如果您存储的数据只与日期有关,而与时间无关,那么可以考虑将其存储为
When SQL Server converts the literal to the filtered column’s type, it
assumes midnight when a time part isn’t indicated. If you want such a
filter to return all rows from the specified date, you need to ensure
that you store all values with midnight as the time.
号
因此,假设您只关心日期,并以此存储数据。上述查询可以简化为:
1 2 3 4 5 6 7 8 9 | --112 is ISO format 'YYYYMMDD' DECLARE @filterDate CHAR(8) = CONVERT(CHAR(8), GETDATE(), 112) SELECT * FROM Sales.Orders WHERE OrderDate = @filterDate |
。
你可以试试这个
1 | CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') |
我通过以下代码对MS SQL 2014进行测试
1 2 | SELECT CASE WHEN CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') THEN 'ok' ELSE '' END |
。
用于将mm/dd/yyyy和mm/dd/yyyy等两个日期进行比较。请记住,字段的列类型必须是datetime。示例:columnname:payment_date datatype:datetime。
之后你可以很容易地比较它。查询是:
1 | SELECT * FROM demo_date WHERE DATE >= '3/1/2015' AND DATE <= '3/31/2015'. |
号
很简单……它测试了它……