[SQL] sqlserver2000 en milliseconden

Pagina: 1
Acties:

  • MrHighStone
  • Registratie: November 2001
  • Laatst online: 03-02-2023
Verschillende zoekacties geven me niet het antwoord op het probleem dat ik heb.
Wanneer ik een bepaalde tijdstring converteer naar een datetime datatype in t-sql (sqlserver 2000), gebeurt er iets raars met de milliseconden. En laten deze milliseconden nou net zo belangrijk zijn...

Wat gebeurt er:
De volgende query levert:
code:
1
2
3
4
select 
    cast ('01:28:01.001' as datetime),
    cast ('01:28:01.008' as datetime),
    cast ('01:28:01.012' as datetime)

Levert het volgende resultaat:
code:
1
2
3
1900-01-01 01:28:01.000  1900-01-01 01:28:01.007  1900-01-01 01:28:01.013

(1 row(s) affected)


Op een voor mij onverklaarbare manier gaat het dus mis met de duizendsten van een seconde, maar waarom?

Een file op de A12 is nooit grappig...


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Omdat SQL Server in 3/100 van een seconde rekent. En dat staat ook duidelijk vermeld in de Books Online :P ;)
Date and time data from January 1, 1753 through December 31, 9999, to an accuracy of one three-hundredth of a second (equivalent to 3.33 milliseconds or 0.00333 seconds). Values are rounded to increments of .000, .003, or .007 seconds, as shown in the table.

[ Voor 67% gewijzigd door Annie op 03-06-2003 22:11 . Reden: quote uit de books toegevoegd ]

Today's subliminal thought is:


  • MrHighStone
  • Registratie: November 2001
  • Laatst online: 03-02-2023
Ik was er al bang voor...
Heb nu maar een functie geschreven die de tijd berekent in milliseconden. Ditmaal zonder af te ronden naar 3/100 van een seconde.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ALTER FUNCTION CalcExactMS
(
  @sTime varchar(12)
) RETURNS int
AS 
BEGIN

    DECLARE @iMilliSeconds int
    DECLARE @dDateTime datetime

    IF (ISDATE(@sTime)) = 1
      BEGIN
      SET @dDateTime     = DATEADD(ms,-(DATEPART(ms, CAST(@sTime As DateTime))), CAST(@sTime As DateTime))
      SET @iMilliSeconds = DATEDIFF(ms, 0, @dDateTime) + CAST(RIGHT(@sTime,3) As Int)
      END
    ELSE
    SET @iMilliSeconds = 0

    RETURN @iMilliSeconds
END

Een file op de A12 is nooit grappig...