Преобразуйте галочки.NET в SQL Server DateTime

Я сохраняю a TimeSpan (от.NET), оценивают в моем дб как BIGINT в SQL Server (сохраняющий свойство Ticks). Я хочу знать, как преобразовать это BIGINT оцените a DATETIME значение в SQL Server (не в.NET). Какие-либо идеи?

Удачи

Править:

Я использую NHibernate для карты a TimeSpan свойство, которое я имею, и это сохраняет свойство Ticks. Я использую его в течение относительных часов (или минуты) управление некоторой датой.

Внутренне в системе все прекрасно, это преобразование не необходимо. Однако при выполнении случайных запросов в SQL Server, трудно понять сохраненную форму a TimeSpan. Так, функция, куда я передаю Ticks значение и a DateTime возвращается дал бы сумму в течение многих часов, минут и секунд это это TimeSpan представляет.

12
задан SteveC 10 February 2012 в 14:01
поделиться

5 ответов

Я не уверен, насколько точно это будет с секундами, но вы можете попробовать что-нибудь вроде:

Declare @TickValue bigint
Declare @Days float

Set @TickValue = 634024345696365272 
Select @Days = @TickValue * POWER(10.00000000000,-7) / 60 / 60 / 24

Select DATEADD(d, Cast(@Days As int), Cast('0001-01-01' As DATE)) 
    + Cast( (@Days - FLOOR(@Days)) As DateTime)

На самом деле другой способ, который будет работать в SQL 2005, следует отметить, что количество тиков с 0001-01-01 по 1900-01-01 составляет 599266080000000000. С этим вы можете сделать:

Declare @TickOf19000101 bigint
Declare @TickValue bigint
Declare @Minutes float

Set @TickOf19000101  = 599266080000000000
Set @TickValue = DATEDIFF(mi, 0 ,CURRENT_TIMESTAMP) * Cast(60 As BigInt) 
                   * POWER(10.00000000000,7) + @TickOf19000101

Select @TickValue
Select @Minutes = (@TickValue - @TickOf19000101) * POWER(10.00000000000,-7) / 60

Select @Minutes
Select DATEADD(MI, @Minutes, '1900-01-01')
18
ответ дан 2 December 2019 в 03:03
поделиться

A TimeSpan не является датой, и его сохранение как таковое может вызвать путаницу в будущем.

Есть ли причина, по которой вы не можете просто сохранить отметки в целочисленном поле и не изменить его значение?

6
ответ дан 2 December 2019 в 03:03
поделиться

Получите значение TimeSpan.TicksPerSecond в .NET (просто запишите его).

Затем в вашем SQL вы можете разделить количество тактов на это число, чтобы получить количество секунд.

Затем вы можете разделить это на 60, чтобы получить минуты и т. Д.

3
ответ дан 2 December 2019 в 03:03
поделиться

Вы должны иметь возможность использовать функцию CAST, встроенную в SQL Server.

SELECT(CAST(CAST(CAST ('02/02/10' AS datetime) AS BIGINT) AS datetime)) 

вы получите 2010-02-02 00:00:00.000

2
ответ дан 2 December 2019 в 03:03
поделиться

Я вычислил это самостоятельно:

288000000000 тиков представляют 8 часов, поэтому следующий SELECT возвращает фиктивную дату с указанным количеством часов ...

SELECT DATEADD(millisecond, 288000000000/10000, CAST('1900-01-01' AS DATETIME))

Спасибо всем усилия.

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

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