Sql Server从DateTime中仅选择日期部分

时间:2014-10-01 11:37:17

标签: sql sql-server datetime

我在Sql Server中遇到日期时间中仅选择日期部分的问题。

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: )

我想我做得不对,但我知道为什么。

4 个答案:

答案 0 :(得分:1)

我认为以下是更好的方法来做你想做的事情:

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数据类型。

答案 1 :(得分:0)

在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;

答案 2 :(得分:0)

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

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条款;你可以非常有效地比较整数并获得相同的结果。

此方法的另一个好处是,您可以轻松地将其应用到月份(例如,获得月份的第一天)和年份。几周需要更多的关注,但这超出了这个答案的范围。

答案 3 :(得分:-1)

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

尝试此查询

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