如何将1毫秒添加到日期时间字符串?


15

基于选择,我可以返回x行,如下所示:

1   2019-07-23 10:14:04.000
1   2019-07-23 10:14:11.000
2   2019-07-23 10:45:32.000
1   2019-07-23 10:45:33.000

我们所有的毫秒都为0。

有没有一种方法可以将1乘以1毫秒,因此选择如下所示:

1   2019-07-23 10:14:04.001
1   2019-07-23 10:14:11.002
2   2019-07-23 10:45:32.003
1   2019-07-23 10:45:33.004

我正在尝试创建一个游标甚至没有成功的更新。

这是获取我想要的结果的查询:

  select top 10 ModifiedOn 
    from [SCHEMA].[dbo].[TABLE]
  where FIELD between '2019-07-23 00:00' and '2019-07-23 23:59'

有81k值。该字段是DATETIME


2
您是否要在第1行中添加1毫秒,在第2行中添加2毫秒,在第3行中添加3毫秒,依此类推?
John Eisbrener

Answers:


33

Datetime不精确到1毫秒的水平。除非您更改为其他数据类型(即datetime2),否则您所要求的是不可能的。

文献资料

重要报价:

精度四舍五入为.000,.003或.007秒


13

DateAdd功能就是您要寻找的。

使用millisecond作为第一个参数的功能,告诉它要添加毫秒。然后使用1将第二个参数用作要添加的毫秒数。

这是一个示例,将当前时间获取到一个变量中,然后将其添加一毫秒,并将结果保存为第二个变量,然后打印每个变量

Declare @RightNow as DateTime2
Declare @RightNowPlusAMillisecond as DateTime2

Select @RightNow = Getdate()
Select @RightNowPlusAMillisecond = DateAdd(millisecond,1,@RightNow)

Print @RightNow
Print @RightNowPlusAMillisecond

结果:

2019-07-23 08:25:38.3500000
2019-07-23 08:25:38.3510000

注意:

正如Forrest在另一个答案中指出的那样,datetime数据类型不能保证毫秒精度。舍入为.000,.003或.007秒的增量。如果要毫秒精度,请使用datetime2


13

@ Doug-Deden有正确的起点,但我只是想尝试回答我认为该问题的初衷-如何将其应用到每行增加毫秒数的结果集中。

在这种情况下,您可以使用ROW_NUMBER通用表表达式(根据需要对表结构进行编辑,包括联接等)。

选择显示值:

;WITH CTE AS (
SELECT t.my_id, t.my_date_column, ROW_NUMBER() OVER (ORDER BY my_date_column, my_id DESC) AS R
FROM Table1 t
)
SELECT TOP 1000 *, DATEADD(MILLISECOND, R, CAST(my_date_column AS datetime2)) [new_date]
FROM CTE
ORDER BY my_date_column

更新联接回到原始表:

;WITH CTE AS (
SELECT t.my_id, t.my_date_column, ROW_NUMBER() OVER (ORDER BY my_date_column, my_id DESC) AS R
FROM Table1 t
)
UPDATE t SET 
my_date_column = DATEADD(MILLISECOND, R, CAST(my_date_column AS datetime2))
FROM CTE c
     JOIN Table1 t ON c.my_id = t.my_id

该CTE是可更新的。无需重新加入Table1。随便做吧UPDATE CTE SET my_date_column =...
史蒂文·希伯

4

我已经用完成了 DATETIME2(3)

如您在下面的查询中看到的,它更多economic

declare @dt1 datetime2(3)
declare @dt2 datetime2

SELECT @DT1 = SYSDATETIME()
SELECT @DT2=  SYSDATETIME()

SELECT [THE LENGTH OF DATETIME2]=DATALENGTH(@DT2)
      ,[THE LENGTH OF DATETIME2(3)]=DATALENGTH(@DT1)

在此处输入图片说明

datetime和之间的区别在这里datetime2得到了很好的解释

在这个练习中,我创建一个临时表,用于测试目的,并与999不同的填充它random dates01-jan-2019今天(23-july-2019

然后按顺序将毫秒数从1设置为999

SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOEXEC OFF

IF OBJECT_ID ('TEMPDB..#T1') IS NOT NULL
   DROP TABLE #T1

CREATE TABLE #t1(the_date DATETIME2(3) NOT NULL PRIMARY KEY CLUSTERED )
GO

-- run this 999 times - hopefully there will be no duplicates
-- SELECT 204*24*60*60 - today is 23-july-2019 - the 203rd day of the year
    DECLARE @DT DATETIME2(3)
    SELECT @DT = CONVERT(DATETIME2(3),
           DATEADD(SECOND, ABS(CHECKSUM(NEWID()) % 17625600), 
                   '2019-01-01'),120) 

    --SELECT @DT

    IF NOT EXISTS( SELECT 1 FROM #T1 WHERE THE_DATE = @DT) 
    INSERT INTO #T1 VALUES (@DT)
GO 999


--check it out what we have
SELECT * FROM #T1

--get the date and the new date
SELECT 
 THE_DATE
,THE_NEW_DATE= DATEADD(MILLISECOND, ROW_NUMBER() OVER (ORDER BY THE_DATE), THE_DATE ) 
 FROM #T1

这就是我得到的:(部分视图)

在此处输入图片说明


2

其他海报之一是正确的。DATETIME(在T-SQL中)不精确到毫秒(精确到毫秒)。

为了达到这种精确度,您需要使用DATETIME2

这是将字符串转换datetimedatetime2,然后加上1毫秒,最后再转换回字符串的示例。

select convert(
            varchar(MAX), --in T-SQL, varchar length is optional
            dateadd(
                millisecond,
                1,
                convert(
                    datetime2,
                    '2019-07-23 12:01:23.11'
                )
            )
        )

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.