繁体   English   中英

SQL Server仅从DateTime选择日期部分

[英]Sql Server Select Only Date Part From DateTime

我在Sql Server中有问题,只能从DateTime中选择日期部分。

DateTime的值为2014-05-01 00:00:00.000。

如果尝试此查询,我没有错误,并且输出正确:

SELECT CONVERT(VARCHAR(10),'2014-05-01 00:00:00.000',110)
2014-05-01

如果尝试在doTable中执行此其他查询:

SELECT
    TOP 100 *
FROM
    [n].[a2].[DOTABLE]
WHERE
    CONVERT(VARCHAR(10),data,110) > DATEADD(DAY, - 1, getdate())
ORDER BY
    data DESC;

我有这个错误:

SQL Server Error Messages - Msg 242 - 
The conversion of a char data type to a datetime data type 
resulted in an out-of-range datetime value.

SQL Server的版本为:

Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86)        
Oct 14 2005 00:33:37        
Copyright (c) 1988-2005 Microsoft Corporation       
Standard Edition on Windows NT 6.1 (Build 7600: )

我想我做错了,但我知道为什么。

我认为以下是做您想要的事的更好方法:

where date >= dateadd(day, 0, datediff(day, 0, getdate()) - 1)

这会将当前日期截断为昨天的午夜,我想这就是您真正想要的。

对于您的方法,请尝试使用格式120:

SELECT TOP 100 *
FROM [n].[a2].[DOTABLE]
WHERE CONVERT(VARCHAR(10), data, 120) > DATEADD(DAY, - 1, getdate())
ORDER BY data DESC;

您可以在两面都这样做:

SELECT TOP 100 *
FROM [n].[a2].[DOTABLE]
WHERE CONVERT(VARCHAR(10), data, 120) > CONVERT(varchar(10), DATEADD(DAY, - 1, getdate()), 120)
ORDER BY data DESC;

此格式为YYYY-MM-DD,可用于比较。

然后,升级SQL Server,并改用date数据类型。

在SQL Server 2008中验证了您的查询。它的正常运行可能是与SQL Server 2005有关的varchar和日期时间之间的转换的特定问题。

您可以在此处为日期类型添加显式转换

 SELECT
    TOP 100 *
FROM
    [n].[a2].[DOTABLE]
WHERE
    CAST( CONVERT(VARCHAR(10),data,110) as datetime) > DATEADD(DAY, - 1, getdate())

ORDER BY
    data DESC;

我的建议是使用以下转换将不需要的日期部分归零(在这种情况下为时间):

declare @n int = datediff(day, 0, [some_datetime_col]);

上面的部分将返回自SQL Server时代以来的天数,以整数形式。 然后,完成转换:

select dateadd(day, @n, 0);

这将增加该天数,返回没有时间部分的datetime时间。 要将其应用于您的示例:

where
    datediff(day, 0, data) > (datediff(day, 0, getdate()) - 1)

就您而言,您不需要将转换回datetime因为它只是where子句; 您可以非常有效地比较整数并获得相同的结果。

此方法的附加好处是,您可以轻松地将其应用于月份(例如,获取月份的第一天)和年份。 数周之内需要多加注意,但这超出了此答案的范围。

为什么要将日期转换为varchar?

试试这个查询

SELECT TOP 100 *
FROM [n].[a2].[DOTABLE]
WHERE data > DATEADD(DAY, - 1, getdate())
ORDER BY data DESC;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM