Я хотел бы получить записи базы данных по диапазону дат, включая данные с включенным диапазоном дат окончания. Столбец TimeStamp
в базе данных имеет тип dateTime2(7)
. Дата и время хранятся в UTC
. Но я отображаю данные, основанные на часовом поясе пользователей. Чтобы добиться этого, я ищу часовой пояс и затем конвертирую его в BaseUtfOffset
в C#
. Ex. 3/18/2020
и 3/29/2020
var newOffSetDate = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);
DateTimeOffset d1 = new DateTimeOffset(Convert.ToDateTime(date1), newOffSetDate.BaseUtcOffset);
DateTimeOffset d2 = new DateTimeOffset(Convert.ToDateTime(date2), newOffSetDate.BaseUtcOffset);
Затем я передаю начальную и конечную даты в процедуре (тип параметра DateTimeOffset
), созданной здесь, чтобы сделать простой оператор выбора в SQL. Возвращенные данные включают только записи с датой начала.
create table MyTable
(
Id int Primary Key Identity(1,1),
[TimeStamp] datetime2(7) not null
)
insert into MyTable(TimeStamp) values('2020-03-29 19:40:46.8500000')
insert into MyTable(TimeStamp) values('2020-03-29 19:40:53.1000000')
insert into MyTable(TimeStamp) values('2020-03-18 17:15:48.2600000')
select * from MyTable
where
convert(datetimeoffset, convert(datetime2(7), timestamp, 1)) >= '3/18/2020 12:00:00 AM -04:00' and
convert(datetimeoffset, convert(datetime2(7), timestamp, 1)) <= '3/29/2020 12:00:00 AM -04:00'
Например, в приведенном выше сценарии я должен получить ВСЕ записи, но я получаю только одну запись.
2020-03-18 17: 15: 48.2600000
Влияет ли формат DateTimeOffset
, полученный в C#
, на результаты или я что-то упустил?
SQLFIDDLE
ОБНОВЛЕНИЕ:
Параметры хранимой процедуры:
,@StartDate DateTimeOffset = NULL
,@EndDate DateTimeOffset = NULL
В примере используется: дата начала 3/18/2019
и дата окончания 3/29/2020
, Метод C#, который преобразует даты в DateTimeOffset, выдает следующий вывод:
d1 = 3/18/2020 12:00:00 AM -04:00
d2 = 3/29/2020 12:00:00 AM -04:00