2015-04-20 3 views
0

В MSSQL, как бы я взял следующие фрагменты информации и преобразовал ее в штамп времени unix?Конвертировать месяц, неделю, день в unix timestamp

  • Месяц = ​​3
  • Week_In_Month = 2
  • DAY_OF_WEEK = 1 (первый день недели воскресенье)
  • seconds_elapsed_during_day = 7200

Это было бы на основе тока год (или любой год). Я искал различные sql-запросы, чтобы преобразовать фактический год/месяц/день из целочисленных компонентов в временную метку unix, но ничего похожего на то, что у меня здесь.

Как и в случае с фоном, это будет использоваться в базе данных, содержащей информацию о часовом поясе, хранящуюся с указанными выше столбцами, указывающую начало и остановку DST. Мне нужно сказать моим разработчикам, как принимать эти значения и преобразовывать их в метку времени, которая может использоваться в других запросах.

Заранее благодарим за помощь!

+0

DST начать/время остановки может быть разными в разные годы, ваша схема базы данных неверна, и вы не можете преобразовать свои данные в timestamp –

+0

, к сожалению, это не «моя» схема, а одна, предоставленная поставщиком, и на данный момент я должен использовать. Я предполагаю, что у них есть процесс обновления этой таблицы по мере внесения изменений. Если мы предположим, что они (или I) будут поддерживать эту таблицу, есть ли решение? – jbomgard

+0

вы не можете использовать неполные данные, вместо этого используйте более или менее полный источник, например http://en.wikipedia.org/wiki/Tz_database –

ответ

0

Если вы хотите конвертировать 2:00 утра во второе воскресенье марта в отметку времени Unix, вам нужно найти второе воскресенье месяца. Вот один из способов:

with y as (
     select '2018' as yyyy 
    ) 
select dateadd(day, 
       15 - (case when datepart(weekday, yyyy+'-03-01') = 1 then 8 
          else datepart(weekday, yyyy+'-03-01') 
        end), 
       yyyy+'-03-01') 
from y; 

Затем вам нужно вычесть 1970-01-01 от этого значения, чтобы получить разницу в секундах и добавить обратно 7200:

with y as (
     select '2018' as yyyy 
    ) 
select datediff(second, '1970-01-01', 
       dateadd(day, 
         15 - (case when datepart(weekday, yyyy+'-03-01') = 1 then 8 
            else datepart(weekday, yyyy+'-03-01') 
           end), 
         yyyy+'-03-01' 
         ) 
       ) + 7200 
from y; 
Смежные вопросы