Выберите * из элементов, где Convert (date, DueDate) = @today - PullRequest
0 голосов
/ 03 декабря 2018

У меня проблемы с простым выбором.Поле базы данных, в котором хранится DueDate, представляет собой DateTimeOffset.

 declare @today Date = GetDate();
 Select * from Items where Convert(date, DueDate) = @today

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

Проблема: GetDate (), поскольку это Sql-сервер, работающий в Azure, фактически возвращает GetUTCDate ().Таким образом, в 21:00 по восточному поясному времени он возвращает не сегодня, а завтра, потому что время по Гринвичу на 5 часов больше (2 часа ночи, следующий день).

Я сделал @today дату, чтобы времячасть может быть проигнорирована.

Но в базе данных DueDate имеет значение 2018-12-02 05:00:00.0000000 +00:00 Но когда это приведено к дате, дата будет 2018-12-02, но @today будет 2018-12-03

Так как мне написать этот SQL?

1 Ответ

0 голосов
/ 03 декабря 2018

Вам необходимо поместить «сегодня» во временную зону, рассмотрите 2 запроса ниже (обратите внимание, как установлено «сегодня»), см. В ВРЕМЕННОЙ ЗОНЕ :

declare @today as datetimeoffset;
SET @today = cast(getdate() as date);

;with Items as (
    select -24 as n, dateadd(hour,-24,SYSDATETIMEOFFSET()) as DueDate

    union all

    select n+1, dateadd(hour,n+1,SYSDATETIMEOFFSET())
    from Items
    where n < 24
    )

Select * , @today
from Items 
where DueDate >= @today and DueDate < dateadd(day,1,@today)
;

GO
  n | DueDate                    | (No column name)          
--: | :------------------------- | :-------------------------
-10 | 03/12/2018 00:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
 -9 | 03/12/2018 01:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
 -8 | 03/12/2018 02:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
 -7 | 03/12/2018 03:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
 -6 | 03/12/2018 04:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
 -5 | 03/12/2018 05:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
 -4 | 03/12/2018 06:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
 -3 | 03/12/2018 07:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
 -2 | 03/12/2018 08:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
 -1 | 03/12/2018 09:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
  0 | 03/12/2018 10:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
  1 | 03/12/2018 11:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
  2 | 03/12/2018 12:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
  3 | 03/12/2018 13:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
  4 | 03/12/2018 14:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
  5 | 03/12/2018 15:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
  6 | 03/12/2018 16:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
  7 | 03/12/2018 17:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
  8 | 03/12/2018 18:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
  9 | 03/12/2018 19:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
 10 | 03/12/2018 20:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
 11 | 03/12/2018 21:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
 12 | 03/12/2018 22:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
 13 | 03/12/2018 23:57:54 +00:00 | 03/12/2018 00:00:00 +00:00
declare @today as datetimeoffset;
SET @today = cast(cast(getdate() as date) as datetimeoffset) AT TIME ZONE 'Pacific Standard Time';

;with Items as (
    select -24 as n, dateadd(hour,-24,SYSDATETIMEOFFSET()) as DueDate

    union all

    select n+1, dateadd(hour,n+1,SYSDATETIMEOFFSET())
    from Items
    where n < 24
    )

Select * , @today
from Items 
where DueDate >= @today and DueDate < dateadd(day,1,@today)
;

GO
  n | DueDate                    | (No column name)          
--: | :------------------------- | :-------------------------
-10 | 03/12/2018 00:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
 -9 | 03/12/2018 01:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
 -8 | 03/12/2018 02:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
 -7 | 03/12/2018 03:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
 -6 | 03/12/2018 04:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
 -5 | 03/12/2018 05:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
 -4 | 03/12/2018 06:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
 -3 | 03/12/2018 07:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
 -2 | 03/12/2018 08:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
 -1 | 03/12/2018 09:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
  0 | 03/12/2018 10:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
  1 | 03/12/2018 11:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
  2 | 03/12/2018 12:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
  3 | 03/12/2018 13:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
  4 | 03/12/2018 14:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
  5 | 03/12/2018 15:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
  6 | 03/12/2018 16:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
  7 | 03/12/2018 17:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
  8 | 03/12/2018 18:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
  9 | 03/12/2018 19:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
 10 | 03/12/2018 20:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
 11 | 03/12/2018 21:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
 12 | 03/12/2018 22:57:54 +00:00 | 02/12/2018 16:00:00 -08:00
 13 | 03/12/2018 23:57:54 +00:00 | 02/12/2018 16:00:00 -08:00

дБ <> скрипка здесь

...