Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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中的DateDiff请求帮助_Sql_Sql Server_Tsql_Sql Server 2008_Stored Procedures - Fatal编程技术网

SQL Server中的DateDiff请求帮助

SQL Server中的DateDiff请求帮助,sql,sql-server,tsql,sql-server-2008,stored-procedures,Sql,Sql Server,Tsql,Sql Server 2008,Stored Procedures,我正在使用SQLServer2008。我有一个表,它有一个datetime类型的列,名为CreateTime。我需要从该表中选择CreateTime距离当前时间(UTC时间)超过3天半小时的所有记录。我正在使用T-SQL存储过程 顺便说一句:CreateTime列是过去的某个时间 我花了相当长的时间学习并从MSDN中搜索DateDiff的帮助,但无法理解。谁能给我看一个样品吗 提前感谢,, 乔治您需要: WHERE-DATEADD(minute,4350,CreateTime)您可以使用minu

我正在使用SQLServer2008。我有一个表,它有一个datetime类型的列,名为CreateTime。我需要从该表中选择CreateTime距离当前时间(UTC时间)超过3天半小时的所有记录。我正在使用T-SQL存储过程

顺便说一句:CreateTime列是过去的某个时间

我花了相当长的时间学习并从MSDN中搜索DateDiff的帮助,但无法理解。谁能给我看一个样品吗

提前感谢,, 乔治

您需要:


WHERE-DATEADD(minute,4350,CreateTime)您可以使用minutes选择并添加带有DATEDIFF的WHERE子句:

SELECT (fields)
FROM (table)
WHERE 
  DATEDIFF(MINUTE, CREATETIME, getutcdate()) <= (3*24*60 + 30)
样本:

SELECT      
  DATEDIFF(MINUTE, '2009-08-01 08:00:00', getutcdate()),
  DATEDIFF(MINUTE, '2009-07-31 20:00:00', getutcdate()),
  DATEDIFF(MINUTE, '2009-07-23 20:00:00', getutcdate())
结果是:

96    816    12337
因此,前两个日期仍然在你的4350分钟范围内(不到3天30分钟前),而第三个日期离你更远


马克

对给出的答案进行了一次小小的狡辩,尽管答案是正确的。不将函数应用于列:将函数应用于比较值

如果CREATETIME被索引,那么它是一个扫描,而不是使用列上的函数进行搜索。 您不需要数百万行来解决这个问题

改编marc_s的答案:

SELECT (fields)
FROM (table)
WHERE 
  CREATETIME <= DATEADD(MINUTE, - (3*24*60 + 30), getutcdate())
选择(字段)
从(表)
哪里

CREATETIME问题实际上指定了3天半小时,而不是1天。谢谢Richard,在您的SQL语句中,第一个参数“.”的意思是?谢谢Richard,我在您的代码中发现了两个问题。:-)1.SQL Server 2008 Enterprise无法识别getdateutc,我需要使用GETUTCDATE;2.我想我应该使用WHERE DATEADD(分钟,4350,[CreationTime])>GETUTCDATE(),而不是WHERE DATEADD(分钟,4350,GETUTCDATE())>[CreationTime],因为过去的时间总是较小的?如果CREATETIME大于getdateutc(),则该值将为负值。它应该是-(3*24*60+30),所以这将是一个在将来某个时候创建的行,对吗?:-)听起来像是时间机器……大家好,对不起,我没有完全理解自己。Createtime已经成为过去。我想我应该使用下面的T-SQL,对吗?其中DATEADD(MINUTE,4350,[CreationTime])>GETUTCDATE()示例对于所述的问题是正确的。当第二个日期大于第一个日期时,DATEDIFF产生一个正数。
SELECT      
  DATEDIFF(MINUTE, '2009-08-01 08:00:00', getutcdate()),
  DATEDIFF(MINUTE, '2009-07-31 20:00:00', getutcdate()),
  DATEDIFF(MINUTE, '2009-07-23 20:00:00', getutcdate())
96    816    12337
SELECT (fields)
FROM (table)
WHERE 
  CREATETIME <= DATEADD(MINUTE, - (3*24*60 + 30), getutcdate())