2010-05-25 3 views
6

Использование LogParser импортировать журналы IIS к БД результатов в одном столбце, который имеет значение даты и второе поле для времени:TSQL объединить поле даты и поле времени

2010-05-25 00:00:00.000 

и

2010-01-01 11:11:58.000 

Я хотел бы закодировать триггер after insert, который объединяет 2 поля.

ответ

6

В случае, если кто-то другой наткнулся на эту тему (или если исходный плакат все еще может использовать этот ответ), загляните в функцию TO_TIMESTAMP (дата, время) в LogParser, которая позволяет объединять временную метку с датой только со временем - только временная метка в значение полной метки времени ... и экономит вас от необходимости конвертировать в db ...

18

Вы можете просто добавить два значения после их литья в типы данных DATE и TIME, если вы используете SQL Server 2008 или более позднюю версию. Вот пример.

declare @datet datetime; 
set @datet = GETDATE(); 

select 
    @datet, 
    cast(@datet as date), 
    cast(@datet as time); 

select 
    cast(cast(@datet as date) as datetime), 
    cast(cast(@datet as time) as datetime), 
    cast(cast(@datet as date) as datetime) + cast(cast(@datet as time) as datetime); 
+0

Дата и время, когда типы данных выглядят намного чище, чем вытягивание позиций из строки. Вы говорите, но не до 08. Таким образом, у вас есть первые 9 ярдов - я могу обновить все строки в таблице - как я могу обновить только вставленные строки - выглядит как минимум, я должен смотреть на «INSERT BEFORE» вместо AFTER thx – justSteve

+0

Если вы может, вообще избегать триггера и просто добавить другой столбец в таблицу в качестве вычисленного столбца. Вы можете сделать это, используя инструкцию s следующим образом: ALTER TABLE yourtable ADD DateAndTime (cast (cast (@datet as date) как datetime) + cast (cast (@datet as time) как datetime)); –

+0

В моем случае у меня было статическое время, на которое я захотелось напасть, и смог избежать внутреннего броска на временной части. Так что cast (cast (some_date_col as date) как datetime + cast ('11: 59: 59 PM 'как дата-время) отлично работал и был немного более кратким. Ymmv – jinglesthula

1

Попробуйте это:

DECLARE @Date varchar(23) 
     ,@Time varchar(23) 
     ,@Both datetime 

SELECT @Date='2010-05-25 00:00:00.000' 
     ,@Time='2010-01-01 11:11:58.000' 

SELECT @Both=LEFT(@Date,10)+' '+RIGHT(@Time,12) 

SELECT @Both 

ВЫВОД:

----------------------- 
2010-05-25 11:11:58.000 

(1 row(s) affected) 

Комплект на основе:

DECLARE @INSERTED table(RowID int, DateOf varchar(23), TimeOf varchar(23), DateTimeOf datetime) 

INSERT @INSERTED VALUES (1,'2010-05-25 00:00:00.000','2010-01-01 11:11:58.000',null) 
INSERT @INSERTED VALUES (2,'2010-04-05 00:00:00.000','2010-01-01 12:34:56.789',null) 
INSERT @INSERTED VALUES (3,'2010-03-15 00:00:00.000','2010-01-01 01:01:01.000',null) 


UPDATE @INSERTED 
    SET DateTimeOf=LEFT(DateOf,10)+' '+RIGHT(TimeOf,12) 

SELECT * FROM @INSERTED 

ВЫВОД:

RowID DateOf     TimeOf     DateTimeOf 
------- ----------------------- ----------------------- ----------------------- 
1  2010-05-25 00:00:00.000 2010-01-01 11:11:58.000 2010-05-25 11:11:58.000 
2  2010-04-05 00:00:00.000 2010-01-01 12:34:56.789 2010-04-05 12:34:56.790 
3  2010-03-15 00:00:00.000 2010-01-01 01:01:01.000 2010-03-15 01:01:01.000 

(3 row(s) affected) 
0

Если у вас есть выбор, чтобы добавить вывод в новый столбец, вы также можете сделать этот новый столбец как вычисленный столбец и определить его, чтобы объединить эти 2 столбца (во время разработки).

Dev

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