我有两个表,其中列 [date]是 DATETIME2(0)的类型。
[date]
DATETIME2(0)
我必须只比较两个记录的日期部分(日 + 月 + 年) ,丢弃时间部分(小时 + 分钟 + 秒)。
我该怎么做?
在 SQLServer2008中,使用 CAST与新的 DATE数据类型比较日期部分:
CAST
DATE
IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)
Marc 的回答有一个小缺点,那就是这两个日期字段都被定型了,这意味着您将无法利用任何索引。
因此,如果需要编写能够从日期字段的索引中获益的查询,那么就需要采用以下(相当复杂的)方法。
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
PS: 仅提取日期的另一种方法(在老版本的 SQLServer 中)是使用内部表示日期的技巧。
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
比较两个日期,比如 MM/DD/YYYY和 MM/DD/YYYY。 记住,Field 的首要列类型必须是 dateTime。 示例: < strong > column nName: 付款日期 dataType: 日期时间。
然后你就可以很容易地比较了。 问题是:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
很简单..。 它测试了它..。
虽然我支持标记为正确的答案。我想为偶然发现这个的人提供一些东西。
一般来说,如果只是针对 日期值进行过滤,那么。Microsoft 建议使用与语言无关的 ymd或 y-m-d格式。
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
在理想情况下,应该避免对筛选列执行任何操作,因为这可能会妨碍 SQLServer 有效地使用索引。也就是说,如果您正在存储的数据只与日期有关,而不是时间,那么可以考虑以 DATETIME的形式存储,并将午夜作为时间。因为:
DATETIME
当 SQLServer 将文本转换为筛选列的类型时,它将 假设午夜时间部分没有指示。如果您想要这样一个 过滤器来返回指定日期之后的所有行,则需要确保 你把所有的值都存储在午夜作为时间。
因此,假设您只关心日期,并以这种方式存储数据。以上查询可简化为:
--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')
我通过以下代码测试 MSSQL2014
select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok' else '' end
您可以使用 DateDiff并在白天进行比较。
DateDiff
DateDiff(dd,@date1,@date2) > 0
意思是 @date2 > @date1
@date2 > @date1
例如:
select DateDiff(dd, '01/01/2021 10:20:00', '02/01/2021 10:20:00')
结果是: 1