简体   繁体   English

DATEADD函数未带来正确的数据SQL Server

[英]DATEADD function is not bringing the correct data SQL Server

I have a float datatype that is actually a date. 我有一个实际上是日期的float数据类型。 I need to use it in the condition to obtain the data for the last 10 minutes. 我需要使用该条件来获取最近10分钟的数据。 I used CAST to convert from float to datetime. 我使用CAST从float转换为datetime。 and then DATEADD to collect the last 10 minutes data but its not working. 然后DATEADD收集最近10分钟的数据,但无法正常工作。

select  CAST(StartTime AS DATETIME) as StartTime
        ,CAST(endtime AS DATETIME) as EndTime
from    BIORADFM_TASK_AUDIT
where   CAST(StartTime AS DATETIME) >= DATEADD(minute, 10, GETDATE());

Result:

StartTime                EndTime
-----------------------  -----------------------
2017-10-12 16:57:06.997  2017-10-12 16:57:06.997
2017-10-12 06:06:59.997  2017-10-12 06:06:59.997
2017-10-12 06:06:47.997  2017-10-12 06:06:47.997
2017-10-11 16:04:53.000  2017-10-11 16:04:53.000

It´s showing data for the next two days, instead of the last 10 minutes starting from getdate. 它显示的是接下来两天的数据,而不是从getdate开始的最后10分钟的数据。

Table Structure:
CREATE TABLE [dbo].[BIORADFM_TASK_AUDIT](
[STRGUID] [nvarchar](32) NOT NULL,
[ACTIVITYUSERID] [int] NOT NULL,
[ACTIVITYSESSIONID] [int] NOT NULL,
[ACTIVITYCODE] [int] NOT NULL,
[SERVERNAME] [nvarchar](256) NOT NULL,
[APPNAME] [nvarchar](20) NOT NULL,
[STARTTIME] [float] NOT NULL,
[ENDTIME] [float] NOT NULL,
[STRDESCRIPTION] [nvarchar](1000) NULL,
[STRMODULENAME] [nvarchar](300) NULL,
CONSTRAINT [PK_BIORADFM_TASK_AUDIT] PRIMARY KEY CLUSTERED 

Sample Data: 样本数据:

StartTime           Endtime
43020.2549421296    43020.2549421296
43020.2550810185    43020.2550810185
43020.6342939815    43020.6342939815
43020.2548032407    43020.2548032407
43020.2548263889    43020.2548263889
43020.2549421296    43020.2549421296
43020.2549305556    43020.2549305556
43020.2549421296    43020.2549421296
43019.2549189815    43019.2549189815

Don't use datediff() . 不要使用datediff() It counts the number of "time boundaries" between two date/times. 它计算两个日期/时间之间的“时间边界”数。

Instead, use date arithmetic: 而是使用日期算术:

WHERE A.ActivityUserID = B.lUserID and 
      CAST(A.StartTime AS DATETIME) >= DATEADD(minute, -10, GETDATE())

Just a wild guess since we have nothing to work with. 只是一个疯狂的猜测,因为我们没有任何合作可做。 It would be a good idea to store datetime data as datetime instead of a strings so you don't have to constantly convert your data to the right datatype. 将datetime数据存储为datetime而不是字符串是一个好主意,这样您就不必不断将数据转换为正确的数据类型。

SELECT A.strGUID
    , u.sUserName
    , A.ServerName
    , A.AppName
    , A.ActivityCode
    , CAST(A.StartTime AS DATETIME) as StartTime
    , CAST(A.endtime AS DATETIME) as EndTime
    , A.strModuleName
    , A.strDescription
    , GETDATE()
FROM INTRAWPROD_TASK_AUDIT A
join HSV_ACTIVITY_USERS u on A.ActivityUserID = u.lUserID 
where convert(datetime, a.StartTime) >= convert(datetime, dateadd(minute, -10, GETDATE()))

If you want rows with an start time situated only in the last 10 minutes you have to filter by range, for example with BETWEEN : 如果要使行的开始时间位于最近的10分钟内,则必须按范围进行过滤,例如使用BETWEEN

SELECT CAST(StartTime AS DATETIME) AS StartTime, CAST(endtime AS DATETIME) AS EndTime
FROM BIORADFM_TASK_AUDIT
WHERE CAST(StartTime AS DATETIME) BETWEEN DATEADD(minute,-10,GETDATE()) AND GETDATE()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM