Расчеты DateTime в SQL Server 2008 R2 - PullRequest
       1

Расчеты DateTime в SQL Server 2008 R2

3 голосов
/ 28 декабря 2011

В моей базе данных есть 3 столбца в таблице - Created, Expires и Expiration_Interval. И Created, и Expires имеют значение datetimeoffset(0), а Expiration_Interval относится к типу данных Time(0).

Created заполняется SYSUTCDATETIME() при вставке новой строки. Данные для Expiration_Interval предоставляются во входном XML-формате в формате hh:mm:ss, извлекаются и заполняются. Требуется заполнить столбец Expires Created+Expiration_Interval. Вот мой подход:

  INSERT INTO SESSIONS
  SELECT 
    Expiration_Interval,
    SYSUTCDATETIME(),
    DATEADD(s,((DATEPART(hh,Timeout)*3600)+(DATEPART(mi,Timeout)*60)+    DATEPART(ss,Timeout)),SYSUTCDATETIME())
  FROM input_xml -- CTE with shredded XML data

Есть ли более простой способ сделать это? Это на SQL Server 2008 R2

Ответы [ 3 ]

2 голосов
/ 28 декабря 2011

Вы можете разыграть Timeout до datetime и использовать +, чтобы добавить время к SYSUTCDATETIME().

SYSUTCDATETIME()+cast(Timeout as datetime)
1 голос
/ 29 декабря 2011

Я предлагаю вам сохранить интервал в виде целого числа (секунд). Тогда вам нужно будет только сделать следующее:

DATEADD(s, Expiration_Interval, Created)
1 голос
/ 28 декабря 2011

Не хочу говорить:

declare @Time as Time = '01:00:00.00'
declare @NoTime as Time = '00:00:00.00'
declare @Now as DateTimeOffset = SysDateTimeOffset()

select @Now as 'Now', @Time as 'One Hour',
    DateDiff( s, @NoTime, @Time ) as 'One Hour in Seconds',
    DateAdd( s, DateDiff( s, @NoTime, @Time ), @Now ) as 'One Hour Hence'

Подсказка: я обычно фиксирую "сейчас" в переменной и затем использую ее в запросе или хранимой процедуре. Это позволяет избежать нескольких вызовов функций и поддерживает синхронизацию. Если, конечно, это необычно долго работающий кусок кода, и вы действительно хотите наблюдать за прогрессом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...