Sql Server仅从DateTime中选择日期部分
我在Sql Server中遇到问题,无法从DateTime中仅选择日期部分 DateTime的值为2014-05-01 00:00:00.000 如果尝试此查询,我没有错误且输出正确:Sql Server仅从DateTime中选择日期部分,sql,sql-server,datetime,Sql,Sql Server,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(
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: )
我想我做得不对,但我知道原因。为什么要将date转换为varchar 请尝试此查询
SELECT TOP 100 *
FROM [n].[a2].[DOTABLE]
WHERE data > DATEADD(DAY, - 1, getdate())
ORDER BY data DESC;
我认为以下是做你想做的事情的更好方法:
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,并改用
日期
数据类型。在SQL Server 2008中验证了您的查询。它运行良好可能是与SQLServer2005有关的一个特定问题,用于varchar和date-time之间的转换
您可以在此处向日期类型添加显式转换
SELECT
TOP 100 *
FROM
[n].[a2].[DOTABLE]
WHERE
CAST( CONVERT(VARCHAR(10),data,110) as datetime) > DATEADD(DAY, - 1, getdate())
ORDER BY
data DESC;
我的建议是使用以下转换将不需要的日期部分归零(在本例中为时间): 以上部分将以整数形式返回自SQL Server的纪元时间以来的天数。然后,要完成转换,请执行以下操作:
select dateadd(day, @n, 0);
这会将天数相加,返回一个没有时间部分的datetime
。要将其应用于您的示例,请执行以下操作:
where
datediff(day, 0, data) > (datediff(day, 0, getdate()) - 1)
在您的情况下,您不需要转换回datetime
,因为它只是一个where
子句;您可以非常有效地比较整数并得到相同的结果
此方法的附加好处是,您可以同样轻松地将其应用于月份(例如,获取月份的第一天)和年份。需要更加注意周数,但这超出了本答案的范围。数据列中存储的日期格式是什么?数据列中存储的日期格式是datetimethank,但您的查询输出为空,但是我有数据为
2014-09-30 00:00:00.000
@AntonioMailtraq的可点记录如果您必须用00:00:00.000捕捉日期,您可以将条件更改为>=或将getdate()更改为当前时间戳谢谢,但您的查询输出为空,但我有数据为2014-09-30 00:00:00.000
@AntonioMailtraq的可上网记录。我看不出这对我的答案有什么影响。我个人喜欢dateadd/datediff方法,并且经常使用它。对于这种事情,子串感觉很脏。@md4。我个人对此深恶痛绝。幸运的是,在2008年之前,我很少需要使用SQL Server。我喜欢它的灵活性,它几乎可以用于任何时间单位(月、分钟、小时,甚至周,只要稍微小心一点),并且可以轻松地放入group by
条款中。当然,convert(date,…)
对于日分辨率更好,但这就是它所能做的。
where
datediff(day, 0, data) > (datediff(day, 0, getdate()) - 1)