Преобразование в DATETIME из отдельных полей даты и времени - PullRequest
2 голосов
/ 04 сентября 2011

У меня есть база данных MYSQL на рабочем месте в моей компании, и временные метки часто хранятся так:

ModDate  |  ModTime  |  Other fields
------------------------------
20110405 |  203055   |  .....
20110506 |  214016   |  .....

Я уверен, что в то время, вероятно, была веская причина для этого (разработчики оставили), но теперь мы в основном используем SQL Server.

Я написал запрос для преобразования поля ModDate в стандартное DATETIME, но, очевидно, я всегда получаю время как 00:00:00.

Как получить действительный объект DATETIME от SQL Server, который объединяет поля ModTime и ModDate, чтобы получить объединенное правильное значение?Обратите внимание, что я уже извлек их в локальный набор результатов и не собираюсь менять базу данных MYSQL (я просто извлекаю ее с помощью OPENQUERY).

Ответы [ 4 ]

3 голосов
/ 04 сентября 2011

Предполагается, что таблица теперь находится в SQL Server, и вопрос больше не имеет никакого отношения к MySQL.

UPDATE dbo.TableName
    SET ModDate = CONVERT(DATETIME, 
    CONVERT(CHAR(8), ModDate, 112) + ' ' 
    + STUFF(STUFF(ModTime,3,0,':'),6,0,':'));

Если вы хотите убедиться, что это правильно, просто запустите:

SELECT
    ModDate, ModTime, NewModDate = CONVERT(DATETIME, 
    CONVERT(CHAR(8), ModDate, 112) + ' ' 
    + STUFF(STUFF(ModTime,3,0,':'),6,0,':'))
FROM dbo.TableName;
1 голос
/ 04 сентября 2011

Если вы действительно ищете решение MySQL, это будет соответствовать всем требованиям, при условии YYYYMMDD и HHMMSS:

update yourtable set datetimecol =
    cast(concat(substring(moddate,1,4),'-', 
     substring(moddate,5,2),'-',
     substring(moddate,7,2),' ', 
     substring(modtime,1,2),':', 
     substring(modtime,3,2),':', 
     substring(modtime,5,2)) as datetime) 

Если вы не хотите сохранять данные, просто сделайте выбор, а необновление, вот так:

select cast(concat(substring(moddate,1,4),'-', 
     substring(moddate,5,2),'-',
     substring(moddate,7,2),' ', 
     substring(modtime,1,2),':', 
     substring(modtime,3,2),':', 
     substring(modtime,5,2)) as datetime) as DateTimeCol
from yourtable
0 голосов
/ 04 сентября 2011

Чтобы добавить часть времени в столбец datetime: Вы можете запросить MySQL, чтобы вернуть общее количество секунд, используя TIME_TO_SEC, затем используйте DATEADD в MSSQL

Примерно так:

UPDATE <TABLE>
SET <datetime column> = DATEADD(second, <MYSQL_QUERY>.TOTAL_SECONDS, <datetime column>)
FROM <TABLE>
INNER JOIN <MYSQL_QUERY> ON <TABLE>.<KEY> = <MYSQL_QUERY>.<KEY>

is:

SELECT <KEY>,TIME_TO_SEC(MOD_TIME) FROM ...

Я не уверен, что вы можете использовать OpenQuery в соединениях, но я уверен, что он будет работать.Если OpenQuery не работает с объединениями, возможно, сохраните результат запроса во временную таблицу в MSSQL.

0 голосов
/ 04 сентября 2011

... при условии, что 20110405 - 5 апреля 2011 года, и что у вас есть новый столбец с именем datetimecol, вы можете сделать это:

update yourtable set datetimecol =
    convert(datetime, substring(moddate,1,4) + '-' + 
     substring(moddate,5,2) + '-' +
     substring(moddate,7,2)+ ' ' + 
     substring(modtime,1,2) + ':' + 
     substring(modtime,3,2) + ':' + 
     substring(modtime,5,2)) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...