我在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: )
我想我做得不对,但我知道为什么。
答案 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;