#sql #datetime
#sql #datetime
Вопрос:
У нас есть бизнес-правило, которое выполняется с 5 утра до 5 утра. Это означает, что в нашей базе данных, если у нас есть продажа, поступающая в ‘2019-01-05 02:00:00’, у этого есть ‘PeriodDate’ или 2019-01-04.
Я пытаюсь создать представление, которое получает сумму продаж за один день, но на данный момент я просто получаю стандартные 12:00-12:00 дня, используя следующий код.
select Convert(date, dbo.Sales.[Time Stamp]) as PeriodDate, sum(Sales.[SalesAmount]) as SalesAmount, siteid from sales
group by Convert(date, dbo.Sales.[Time Stamp]), siteid
Что мне нужно сделать, чтобы сгруппировать продажи по правильной дате периода (с 5 утра до 5 утра).
примечание.b. Временная метка столбца — это столбец DateTime, поэтому я изначально преобразовал его в дату.
Комментарии:
1. Я предполагаю, что это SQL Server, правильно? Какая версия?
Ответ №1:
Вы можете вычесть 5 часов из [Time Stamp]
, а затем преобразовать в date
перед группировкой:
select
convert(date, dateadd(hour, -5, [Time Stamp])) as PeriodDate,
sum([SalesAmount]) as SalesAmount,
siteid
from sales
group by
convert(date, dateadd(hour, -5, [Time Stamp])),
siteid
Комментарии:
1. Одна вещь, которая могла бы немного ускорить обработку, — это вложить ваш
CONVERT()
в подзапрос, и тогда вы сможете использовать агрегациюPeriodDate
без необходимостиCONVERT()
повторять дважды.2. Это идеально, спасибо @forpas. И я добавлю в подзапрос, чтобы ускорить время обработки Shawn. Спасибо команде
3. @JoshFletcher Два других замечания: 1) Используйте
datetime2
вместоdatetime
. learn.microsoft.com/en-us/sql/t-sql/data-types/… 2) Если вы остаетесь сdatetime
, он округляется до 3 тысячных долей миллисекунды. Итак, в зависимости от того, как вы принимаете временную метку, если заказ поступает в04:59:59.998
, он будет округлен до05:00:00.000
и будетsum()
отредактирован не в тот день.