Sql Server从DateTime中只选择日期部分
我在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(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服务器的版本是:
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
数据类型。
谢谢,但您的查询输出为空,但我在具有数据的可点记录中'2014-09-30 00 :00:00.000' – 2014-10-01 11:45:22
@AntonioMailtraq。 。 。我没有看到我的答案中有什么影响。 – 2014-10-01 11:47:23
我个人喜欢dateadd/datediff方法,并经常使用它。子串对这种事情感觉很脏。 – md4 2014-10-01 11:58:55
为什么要将日期转换为varchar?
尝试此查询
SELECT TOP 100 *
FROM [n].[a2].[DOTABLE]
WHERE data > DATEADD(DAY, - 1, getdate())
ORDER BY data DESC;
谢谢,但是你的查询输出为空,但是我在可数记录中有数据'2014-09-30 00:00:00.000' – 2014-10-01 11:42:58
@AntonioMailtraq如果你必须在00:00:00.000之间捕捉日期,您可以将condtition更改为> =或将getdate()更改为CURRENT_TIMESTAMP – 2014-10-01 11:48:17
在SQL Server 2008中验证了您的查询。它运行良好可能是SQL Server 2005与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;
我的建议是使用下面的转换零出你不requre日期部分(在这种情况下时间):
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
条款;您可以非常有效地比较整数并获得相同的结果。
这种方法的附加好处是,您可以轻松地将它应用到几个月(例如获取月的第一天)和年。需要更多的关注与数周,但这超出了这个答案的范围。
数据列中存储日期的格式是什么? – jpw 2014-10-01 11:39:09
存储在数据列中日期的格式是datetime – 2014-10-01 11:40:41