Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Server仅从DateTime中选择日期部分_Sql_Sql Server_Datetime - Fatal编程技术网

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

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(

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

我想我做得不对,但我知道原因。

为什么要将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)