SQL getdate()精度

时间:2013-10-24 15:07:27

标签: sql datetime precision getdate

我有一个表,用于维护应用程序中各种控件的输入时间和剩余时间。如果用户输入父控件,则将输入时间的记录插入到具有空闲时间的表中。如果用户随后在其中输入子控件,则父空闲时间将从null更新,并且为内部控件输入的时间将写入具有空时间剩余值的新记录中。在我们运行的应用程序的特定区域内花费的时间至关重要。问题是输入的时间用于内部控制被记录为在为外部控制更新剩余时间之前。保持时间的表是:

CREATE TABLE [dbo].[tTimeCapture](
    [RECNUM] [int] IDENTITY(1,1) NOT NULL,
    [Store_ID] [int] NULL,
    [Tab_ID] [int] NULL,
    [Dept_ID] [int] NULL,
    [SubDept_ID] [int] NULL,
    [Enter] [datetime] NULL,
    [Leave] [datetime] NULL,
    [IsStoreCall] [bit] NOT NULL,
    [Upload] [int] NOT NULL,
 CONSTRAINT [PK_tTimeCapture] PRIMARY KEY CLUSTERED 
(
    [RECNUM] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

此proc更新外部控件的保留时间并插入内部控件的记录:

 if exists (
      select
         *
      from
         tTimeCapture
      where
         Leave is null
   )
   begin
      exec sEndTimeCapture
   end

   INSERT INTO 
      tTimeCapture(
         Store_ID, 
         Tab_ID, 
         Dept_ID, 
         SubDept_ID, 
         Enter, 
         Leave,
         IsStoreCall, 
         Upload
      )
   SELECT 
      @Store_ID as Store_ID,
      @Tab_ID as Tab_ID,
      @Dept_ID as Dept_ID,
      @Subdept_ID as SubDept_ID,
      GETDATE() as Enter,
      null as Leave,
      @isStoreCall as IsStoreCall,
      0 as Upload

sEndTimeCapture proc如下:

 update
         tTimeCapture
      set
         Leave = getdate()
      where
         Leave is null

当输入外部控件时,第一个proc被称为插入一个空值为零的新记录。保留外部控件并输入内部控件,proc将外部控件的更新时间更新为第二个proc中的getdate(),之后它将为内部控件插入一个带有空值的新记录。每隔一段时间,内部控制的输入时间就在外部控制的停留时间之前。怎么会这样?这是getdate()精度的问题吗?外部控制的左边时间是:2013-10-21 12:20:36.753 进入内部控制的时间是2013-10-21 12:20:36.750

1 个答案:

答案 0 :(得分:1)

您应该使用精度高于SYSDATETIMEGetDate

另外,将输入/离开日期字段的datetime类型更改为datetime2

Difference between DateTime and DateTime2

GetDate vs SysDateTime