У меня есть представление о базе данных, которая получает статус некоторых рабочих элементов. Например, он получает дату начала и дату окончания, а затем выполняет некоторую математику на основе GetDate()
, чтобы вернуть мне ответ типа «Work Remaining
».Обработка часовых поясов
Проблема в том, что сервер базы данных находится в Соединенных Штатах, и я сижу в Австралии.
Итак, время здесь 19h33 20 июля, а GetDate()
на сервере возвращает 02h33 20-го числа.
Как обращаться с часовыми поясами? Должен ли мой пользовательский профайл иметь поле часового пояса, и я вычитаю или добавляю часы на стороне клиента? Проблема в том, что все нужно манипулировать датами и временем. То есть приложение и любые отчеты.
У меня есть вид, например, который возвращает мне оставшиеся часы определенной работы. Он использует GETDATE(), чтобы вычислить это:
ALTER VIEW [dbo].[vwSprintSummary] AS
SELECT
SprintId,
SprintName,
MIN(DateValue) AS FirstSprintDate,
MAX(DateValue) AS LastSprintDate,
SprintEndDate,
COUNT(DISTINCT PersonId) AS AssignedPeople,
COUNT(DISTINCT ProjectResourceId) AS AssignedRoles,
SUM(AssignedProductiveHours * CanBurnDown) AS Capacity,
SUM(CASE WHEN CAST(GETDATE() AS DATE) <= DateValue THEN AssignedProductiveHours* CanBurnDown ELSE 0 END) AS RemainingCapacity
FROM [vwSprintDailyBreakdown]
GROUP BY SprintName, SprintId, SprintStartDate, SprintEndDate
GO
Так или иначе, мне нужно изменить GetDate() к 'DATEADD ... так что я могу получить ответы на правильный часовой пояс?
В этом случае, «исправление» было бы изменить GETDATE()
к DATEADD(HOUR, 17, GETDATE())
Запрограммированные, я знаю, но, в сущности, что бы решить проблему.
Невозможно каким-то образом сообщить серверу моей зоне и получить ее, чтобы вернуть даты на основе моего местоположения?
Отчасти это зависит от характера даты/времени. Например, имели ли исходные данные связанный часовой пояс, или это просто «момент времени»? Что означает «конечная дата» рабочего элемента - означает *, что * имеет связанный часовой пояс? Есть много вещей, о которых стоит подумать, и ответа на один размер не подходит. # –
Спасибо Jon. Я опубликовал пример моей проблемы. Времена хранятся в виде Datetime.Now из приложения. И фактически, временная часть не используется. Я сосредоточен на днях (большинство дат хранится как DATE). – Craig
Почему они хранятся как 'DateTime.Now'? Как говорит Дай, обычно * лучше хранить вещи в UTC. Я бы лично выслал текущую дату/время в запросе, вместо того, чтобы использовать GETDATE в SQL - если вы можете контролировать все с одного места, это будет проще (я думаю!) –