Как иметь дело с устройством хранения данных времени в SQL

ОП запросил

рассчитать разницу, а затем в конечном итоге кумулятивную сумму разностей переменной. Расчеты [...] необходимо начинать заново, когда коэффициент чередуется взад-вперед.

blockquote>

Вычисление различий

Функцию rleid() из пакета можно использовать для выявления изменений в ant:

library(data.table)
setDT(test)[, diff := c(0, diff(x)), by = rleid(ant)]
test
       x ant diff
 1: 1.64   n 0.00
 2: 2.54   n 0.90
 3: 3.53   s 0.00
 4: 3.82   s 0.29
 5: 4.28   s 0.46
 6: 4.74   s 0.46
 7: 4.86   n 0.00
 8: 5.11   s 0.00
 9: 5.53   s 0.42
10: 5.95   n 0.00
11: 6.38   s 0.00
12: 6.73   n 0.00
13: 7.40   s 0.00
14: 8.51   s 1.11
15: 8.52   s 0.01
16: 8.57   n 0.00
17: 8.91   s 0.00
18: 9.33   n 0.00
19: 9.57   s 0.00
20: 9.83   s 0.26
blockquote>

Или, используя shift():

setDT(test)[, diff := x - shift(x, fill = x[1]), by = rleid(ant)]

Вычисление совокупных сумм напрямую

Если я правильно понимаю, вычисление Различия подразумевались только в качестве промежуточного шага к окончательному вычислению совокупных сумм, которые необходимо начинать заново, когда коэффициент чередуется взад-вперед .

Это может быть сделано непосредственно, потому что совокупная сумма разностей x равна x минус первое значение x для каждой серии идентичных значений ant:

setDT(test)[, cumsum := x - x[1L], by = rleid(ant)]
test
       x ant diff cumsum
 1: 1.64   n 0.00   0.00
 2: 2.54   n 0.90   0.90
 3: 3.53   s 0.00   0.00
 4: 3.82   s 0.29   0.29
 5: 4.28   s 0.46   0.75
 6: 4.74   s 0.46   1.21
 7: 4.86   n 0.00   0.00
 8: 5.11   s 0.00   0.00
 9: 5.53   s 0.42   0.42
10: 5.95   n 0.00   0.00
11: 6.38   s 0.00   0.00
12: 6.73   n 0.00   0.00
13: 7.40   s 0.00   0.00
14: 8.51   s 1.11   1.11
15: 8.52   s 0.01   1.12
16: 8.57   n 0.00   0.00
17: 8.91   s 0.00   0.00
18: 9.33   n 0.00   0.00
19: 9.57   s 0.00   0.00
20: 9.83   s 0.26   0.26
blockquote>

13
задан BoltBait 21 October 2008 в 00:28
поделиться

3 ответа

всегда храните данные ДАТЫ И ВРЕМЕНИ в Скоординированное Всемирное время (UTC иначе GMT)

  • это избегает всех проблем часового пояса
  • это избегает проблем летнего времени
  • это позволяет простой математике даты всегда работать
  • это позволяет транзакциям в различных часовых поясах оставаться в синхронизации
  • это позволяет Вам перемещать данные в другой сервер в другом часовом поясе и не завинчивать все
  • и т.д. "Универсальное" время, имейте смысл?

C# DateTime обеспечивает DateTime. UtcNow и ToLocalTime (), SQL обеспечивает GETUTCDATE (). Вот функция SQL для преобразования UTC в местное время -

-- convert UTC to local time
create FUNCTION [dbo].[udfUtcToLocalTime]
(
    @gmt datetime
)
RETURNS datetime
AS
BEGIN
    DECLARE @dt datetime
    SELECT 
        @dt = dateadd(millisecond,datediff(millisecond,getutcdate(), getdate()),@gmt)
    RETURN @dt
END

пример:

SELECT dbo.udfUtcToLocalTime(someDateTimeField)
FROM someTable
17
ответ дан 1 December 2019 в 20:58
поделиться

Сохраните времена UTC в своей базе данных и локализуйте те времена каждый раз, когда Вы хотите показать их пользователю

7
ответ дан 1 December 2019 в 20:58
поделиться

Сохраните его как время UTC и затем формуйте вычисление часового пояса на клиентском конце в C#, используют.ToUniversalTime () на объекте DateTime получить время UTC, хранилище что на сервере и затем используют.ToLocalTime () для преобразования его назад.

4
ответ дан 1 December 2019 в 20:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: