Столбец
A datetimeoffset
позволит вам эффективно запрашивать равенство и диапазон, если вы не будете преобразовывать значение столбца.Вместо того, чтобы приводить в качестве даты, запросы диапазона дат, включающие временные типы, которые включают компонент времени, могут быть эффективно выполнены с включающим начальным значением и исключительным конечным значением.
Ниже приведен пример, показывающий как поиск на равенство, так и поиск по диапазону.Поиск в кластеризованном индексе используется в обоих случаях.
CREATE TABLE dbo.DateTimeOffsetExample (
DateTimeOffsetColumn datetimeoffset NOT NULL
);
CREATE INDEX cdx ON dbo.DateTimeOffsetExample(DateTimeOffsetColumn);
GO
INSERT INTO dbo.DateTimeOffsetExample(DateTimeOffsetColumn)
VALUES
--Central Standard Time
('2018-12-14 23:00:00.00000000 -06:00')
, ('2018-12-15 07:00:00.00000000 -06:00')
, ('2018-12-15 12:00:00.00000000 -06:00')
, ('2018-12-15 19:00:00.00000000 -06:00')
, ('2018-12-15 22:00:00.00000000 -06:00')
, ('2018-12-15 23:00:00.00000000 -06:00')
, ('2018-12-16 00:00:00.00000000 -06:00')
--Eastern Standard Time
, ('2018-12-15 00:00:00.00000000 -05:00')
, ('2018-12-15 08:00:00.00000000 -05:00')
, ('2018-12-15 13:00:00.00000000 -05:00')
, ('2018-12-15 20:00:00.00000000 -05:00')
, ('2018-12-15 23:00:00.00000000 -05:00')
, ('2018-12-16 00:00:00.00000000 -05:00')
, ('2018-12-16 01:00:00.00000000 -05:00')
--Central European Standard Time
, ('2018-12-15 06:00:00.00000000 +01:00')
, ('2018-12-15 14:00:00.00000000 +01:00')
, ('2018-12-15 19:00:00.00000000 +01:00')
, ('2018-12-16 02:00:00.00000000 +01:00')
, ('2018-12-16 05:00:00.00000000 +01:00')
, ('2018-12-16 06:00:00.00000000 +01:00')
, ('2018-12-16 07:00:00.00000000 +01:00')
--SE Asia Standard Time
, ('2018-12-15 12:00:00.00000000 +07:00')
, ('2018-12-15 20:00:00.00000000 +07:00')
, ('2018-12-16 01:00:00.00000000 +07:00')
, ('2018-12-16 08:00:00.00000000 +07:00')
, ('2018-12-16 11:00:00.00000000 +07:00')
, ('2018-12-16 12:00:00.00000000 +07:00')
, ('2018-12-16 13:00:00.00000000 +07:00');
GO
Равенство:
--equality (clustered index seek using equality predicate)
DECLARE @LocalTime datetimeoffset = '2018-12-15 00:00:00.00000000 -05:00';
SELECT *
FROM dbo.DateTimeOffsetExample
WHERE DateTimeOffsetColumn = @LocalTime;
+------------------------------------+
| DateTimeOffsetColumn |
+------------------------------------+
| 2018-12-14 23:00:00.0000000 -06:00 |
| 2018-12-15 00:00:00.0000000 -05:00 |
| 2018-12-15 06:00:00.0000000 +01:00 |
| 2018-12-15 12:00:00.0000000 +07:00 |
+------------------------------------+
Запрос диапазона для одной даты:
--range (clustered index seek using range predicate)
DECLARE
@LocalTimeStart datetimeoffset = '2018-12-15 00:00:00.00000000 -05:00'
, @LocalTimeEnd datetimeoffset = '2018-12-16 00:00:00.00000000 -05:00';
SELECT *
FROM dbo.DateTimeOffsetExample
WHERE DateTimeOffsetColumn >= @LocalTimeStart
AND DateTimeOffsetColumn < @LocalTimeEnd;
+------------------------------------+
| DateTimeOffsetColumn |
+------------------------------------+
| 2018-12-14 23:00:00.0000000 -06:00 |
| 2018-12-15 00:00:00.0000000 -05:00 |
| 2018-12-15 06:00:00.0000000 +01:00 |
| 2018-12-15 12:00:00.0000000 +07:00 |
| 2018-12-15 07:00:00.0000000 -06:00 |
| 2018-12-15 08:00:00.0000000 -05:00 |
| 2018-12-15 14:00:00.0000000 +01:00 |
| 2018-12-15 20:00:00.0000000 +07:00 |
| 2018-12-15 12:00:00.0000000 -06:00 |
| 2018-12-15 13:00:00.0000000 -05:00 |
| 2018-12-15 19:00:00.0000000 +01:00 |
| 2018-12-16 01:00:00.0000000 +07:00 |
| 2018-12-15 19:00:00.0000000 -06:00 |
| 2018-12-15 20:00:00.0000000 -05:00 |
| 2018-12-16 02:00:00.0000000 +01:00 |
| 2018-12-16 08:00:00.0000000 +07:00 |
| 2018-12-15 22:00:00.0000000 -06:00 |
| 2018-12-15 23:00:00.0000000 -05:00 |
| 2018-12-16 05:00:00.0000000 +01:00 |
| 2018-12-16 11:00:00.0000000 +07:00 |
+------------------------------------+