Получить последние мс до завтра в SQL Server? - PullRequest
0 голосов
/ 26 февраля 2012

Я использую команду Between в SQL Server.

Мне нужно найти:

 select * from MyTable where myDate
 between getdate() and [1ms before tomorrow  = 2012-02-26 :23:59:59:999]

Я не хочу [2012-02-27: 00: 00: 00: 000], потому что будущие запросы должны использовать это значение.

Так что мне нужно 1 мс до завтра.

Однако - это то, что я пытался, но по какой-то причине он отказывается дать мне ценность желания! и дай мне: 2012-02-26 23:59:59.997 + непредсказуемые результаты!

Почему это? Чего мне не хватает?

Я хочу получить 2012-02-26 :23:59:59:999!

enter image description here

Ответы [ 2 ]

3 голосов
/ 26 февраля 2012

Почему бы не указать вместо этого эксклюзивный диапазон?

SELECT * FROM `MyTable`
 WHERE `myDate` >= GETDATE() AND `myDate` < (tomorrow)

(я не могу понять, как получить завтрашний DATETIME, как обычно я парень из MySQL, ноЯ полагаю, что вы уже знаете, как это сделать.)

В противном случае вы застряли в бездействии со значениями с плавающей точкой сомнительной точности.

2 голосов
/ 26 февраля 2012

SQL Server DATETIME имеет точность 3,33 мс - вы всегда получите .997 в качестве значения, близкого к полному часу. Это так, как есть, и вы не можете изменить его в SQL Server 2005. Прочтите все об этом на Демистификация типа данных SQL Server DATETIME .

В SQL Server 2008 вы можете использовать тип данных DATETIME2, который имеет точность 100 нс, поэтому у вас есть до 7 точных цифр после десятичной точки «секунд».

Обновление: Если вы хотите получить 0,999 с DATETIME2, вам необходимо использовать:

DECLARE @dt2 DATETIME2
-- you need to cast GETDATE() to DATETIME2 - otherwise it's a DATETIME !
SET @dt2 = CAST(GETDATE() AS DATETIME2) 

DECLARE @dt2_Added DATETIME2
SET @dt2_Added = DATEADD(d, DATEDIFF(d, 0, @dt2) + 1, 0) 

SELECT DATEADD(ms, -1, @dt2_added)

Результат:

2012-02-26 23:59:59.9990000

Обновление № 2: все становится страннее ...

Если я использую SYSDATETIME() вместо GETDATE(), это дает мне DATETIME2 с самого начала - но если я делаю вычисления за один шаг:

DECLARE @dt2 DATETIME2
SET @dt2 = SYSDATETIME()

SELECT DATEADD(ms, -1, DATEADD(d, DATEDIFF(d, 0, @dt2) + 1, 0) )

Я получаю результат:

2012-02-27 00:00:00.000

но если я сделаю один и тот же расчет в два этапа:

DECLARE @dt2 DATETIME2
SET @dt2 = SYSDATETIME()

DECLARE @dt2_Added DATETIME2
SET @dt2_Added = DATEADD(d, DATEDIFF(d, 0, @dt2) + 1, 0) 

SELECT DATEADD(ms, -1, @dt2_added)

Я получаю ожидаемый результат:

2012-02-26 23:59:59.9990000

Это действительно довольно странно ......

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...