НЕ ДЕЛАЙТЕ это; попытаться получить «последнюю секунду» в последний день предыдущего месяца
я сделать это смелое заявление, исходя из предположения, вы пытаетесь использовать BETWEEN и вы обеспокоены тем, с точностью что-то вроде этого:
select sum(value) from Atable
where [Adate] BETWEEN '20151201' AND '21051231 59:59:59'
Но сложность прибытия в последний момент времени в последний день любого месяца решается так легко, используя вместо этого первый день следующего месяца. Все, что вам также нужно сделать, это отказаться от использования МЕЖДУ. Как это:
select sum(value) from Atable
where [Adate] >= '20151201' and [Adate] < '21060101'
МЕНЕЕ «первый день этого месяца»
Вот как вы решить головоломку.
&: Точность (точность) smalldatetime, datetime и datetime2 все отличается, тем более причина не использовать МЕЖДУ.
см "Будьте осторожны ошибок округления" в http://sqlmag.com/t-sql/t-sql-best-practices-part-2
В частности, это сделать:
DateLogged < ВЫБРАТЬ DATEADD (МЕСЯЦ, DATEDIFF (МЕСЯЦ, 0, GETDATE()) , 0)
Это будет на 100% точным для столбцов даты, smalldatetime, datetime и datetime2.
Вот еще одна попытка объяснить, почему МЕНЕЕ [the_next_day_at_00: 00: 00 + 0000000] является точным и использование 22:59:59 не является точным. Пожалуйста, обратите внимание точности данных выборки
SQL Fiddle
Сервер 2014 Настройка схемы MS SQL:
Запрос 1:
DECLARE @Tbl TABLE
( [ID] int identity(1,1)
, [DT_a] datetime
, [DT_b] datetime
, [DT_c] datetime2
)
INSERT INTO @Tbl
([Dt_a], [Dt_b], [Dt_c])
VALUES
(
'20151231 23:59:59'
, '20151231 23:59:59.997'
, '20151231 23:59:59.9999999'
)
select
'where [DT_b] <= 20151231 23:59:59' as FilterString
, max([Dt_a]) as [Dt_a]
, max([Dt_b]) as [Dt_b]
, max([Dt_c]) as [Dt_c]
from @Tbl
where [DT_b] <= '20151231 23:59:59'
UNION ALL
select
'where [DT_b] < 20160101'
, max([Dt_a]) as [Dt_a]
, max([Dt_b]) as [Dt_b]
, max([Dt_c]) as [Dt_c]
from @Tbl
where [DT_b] < '20160101'
Results:
| FilterString | Dt_a | Dt_b | Dt_c |
|-----------------------------------|----------------------------|----------------------------|-----------------------------|
| where [DT_b] <= 20151231 23:59:59 | (null) | (null) | (null) |
| where [DT_b] < 20160101 | December, 31 2015 23:59:59 | December, 31 2015 23:59:59 | 2015-12-31 23:59:59.9999999 |
точность данных
Для того, чтобы избежать возможных ошибок округления от временных единиц НЕ ИСПОЛЬЗОВАТЬ < = 23:59:59
Вместо того, чтобы использовать менее [the_next_day]
И , как следствие, ИЗБЕГАЙТЕ ИСПОЛЬЗОВАТЬ МЕЖДУ МЕЖДУ на диапазоны дат.
Как уже отмечалось, это, вероятно, плохая идея - или вы * намереваетесь * исключить значение «2015-11-30T11: 59: 59.347'? –