Я сохраняю 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
представляет.
Я не уверен, насколько точно это будет с секундами, но вы можете попробовать что-нибудь вроде:
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')
A TimeSpan
не является датой, и его сохранение как таковое может вызвать путаницу в будущем.
Есть ли причина, по которой вы не можете просто сохранить отметки в целочисленном поле и не изменить его значение?
Получите значение TimeSpan.TicksPerSecond
в .NET (просто запишите его).
Затем в вашем SQL вы можете разделить количество тактов на это число, чтобы получить количество секунд.
Затем вы можете разделить это на 60, чтобы получить минуты и т. Д.
Вы должны иметь возможность использовать функцию CAST, встроенную в SQL Server.
SELECT(CAST(CAST(CAST ('02/02/10' AS datetime) AS BIGINT) AS datetime))
вы получите 2010-02-02 00:00:00.000
Я вычислил это самостоятельно:
288000000000 тиков представляют 8 часов, поэтому следующий SELECT
возвращает фиктивную дату с указанным количеством часов ...
SELECT DATEADD(millisecond, 288000000000/10000, CAST('1900-01-01' AS DATETIME))
Спасибо всем усилия.