2015-12-03 4 views
0

Я хочу сохранить время даты в таблице базы данных с типом столбца BIGINT, как указано нижеКак преобразовать Long в DateTime?

DECLARE @temp TABLE (dt BIGINT); 

INSERT INTO @temp (dt) 
SELECT (20151201190350100) 
UNION 
SELECT (2015120290350100) 
UNION 
SELECT (20151203190350100) 
UNION 
SELECT (20151204190350100) 
UNION 
SELECT (20151205190350100) 
UNION 
SELECT (20151206190350100) 

SELECT * 
FROM @temp 
WHERE dt BETWEEN 2015120290350100 
     AND 20151205190350100 

дата, 2015 12 05 19 03 50 100 мне нужно использовать WHERE пункт, Это хороший подход, если я использую, чтобы сохранить и реактивная datetime, пожалуйста, поделитесь, если у вас есть лучшая техника.

+4

Есть ли веская причина использовать bigint вместо фактического типа даты? –

+0

Для целей отчетности я обнаружил, что datetime занимает больше времени, чем долго. –

+1

Почему bigint, а не один из доступных [SqlServer типов] (https://msdn.microsoft.com/en-us/library/ms186724.aspx#DateandTimeDataTypes), который может хранить даты? –

ответ

0
DECLARE @temp TABLE (
    dt BIGINT, 
    val AS CAST(STUFF(STUFF(STUFF(STUFF(CAST(dt AS VARCHAR), 9, 0, ' '), 12, 0, ':'), 15, 0, ':'), 18, 0, ':') AS DATETIME) 
) 

INSERT INTO @temp (dt) 
VALUES 
     (20151201190350100) 
    , (20151202090350100) 
    , (20151203190350100) 
    , (20151204190350100) 
    , (20151205190350100) 
    , (20151206190350100) 

SELECT * 
FROM @temp 
WHERE val BETWEEN '2015-12-01 19:03:50.100' AND '2015-12-05 19:03:50.100' 

результатов -

dt     val 
-------------------- ----------------------- 
20151201190350100 2015-12-01 19:03:50.100 
20151202090350100 2015-12-02 09:03:50.100 
20151203190350100 2015-12-03 19:03:50.100 
20151204190350100 2015-12-04 19:03:50.100 
20151205190350100 2015-12-05 19:03:50.100 

добавить вычисляемый столбец -

ALTER TABLE dbo.tbl 
    ADD val AS CAST(STUFF(STUFF(STUFF(STUFF(CAST(dt AS VARCHAR), 9, 0, ' '), 12, 0, ':'), 15, 0, ':'), 18, 0, ':') AS DATETIME) --PERSISTED 
1

Ответ на ваш вопрос:

Просто используйте тип datetime данных для значений времени даты магазина. Это будет проще по многим причинам.

CREATE TABLE #temp (dt DATETIME); 

INSERT INTO #temp 
     (dt 
     ) 
     SELECT ('20151201 19:03:50:100') 
     UNION 
     SELECT ('20151202 09:03:50:100') 
     UNION 
     SELECT ('20151203 19:03:50:100') 
     UNION 
     SELECT ('20151204 19:03:50:100') 
     UNION 
     SELECT ('20151205 19:03:50:100') 
     UNION 
     SELECT ('20151206 19:03:50:100') 

SELECT * 
FROM #temp 
WHERE dt BETWEEN '20151202 09:03:50:100' 
      AND  '20151205 19:03:50:100' 

DROP TABLE #temp 

Примечания: в ваших выборочных значениях вы потеряли несколько 0 'в начале значений часовых, где время 09:03:50 - ваше значение 90350, отсутствует нуль. Я исправил эти ошибки в этом примере.

Смежные вопросы