2013-07-03 6 views
1

Я пытаюсь извлечь некоторые данные из SQL Server в Microsoft Excel 2007. У меня есть настройка соединения, и все работает нормально, за исключением временных меток. Я могу получить только даты, а не соответствующие часы, минуты или секунды. Я могу извлекать данные из базы данных SQL с помощью инструмента запросов Excel ODBC, и там указаны часы и минуты. Я пробовал различные варианты CAST(). Никто из них не решил мою проблему. Я запускаю Windows XP. Я не знаю, какая версия Microsoft SQL работает на сервере. Мой код показан ниже.Неполная временная метка с использованием ADODB с VBA для Excel

Sub Populate_Sheet(theSheet As Worksheet) 

    'Declare variables' 
     Dim objMyConn As ADODB.Connection 
     Dim objMyCmd As ADODB.Command 
     Dim objMyRecordset As ADODB.Recordset 
     Set objMyConn = New ADODB.Connection 
     Set objMyCmd = New ADODB.Command 
     Set objMyRecordset = New ADODB.Recordset 

     Dim executeThisSQLStatement As String 
     'Dim target As Worksheet 
     'Set target = theSheet 

     executeThisSQLStatement = "SELECT CAST(DateHour_CPT AS TIMESTAMP) FROM EnergyData_v" 

    'Open Connection' 
     objMyConn.ConnectionString = "driver={SQLServer};Data Source=DataMart;User ID=acctname.value;Password=mypass.value;" 

     objMyConn.Open 

    'Set and Excecute SQL Command' 
     Set objMyCmd.ActiveConnection = objMyConn 
     objMyCmd.CommandText = executeThisSQLStatement 
     objMyCmd.CommandType = adCmdText 

    'Open Recordset' 
     Set objMyRecordset.Source = objMyCmd 
     objMyRecordset.Open 

    'Copy Data to Excel' 
     theSheet.Range("A6").CopyFromRecordset objMyRecordset 

End Sub 
+0

Возможно, вы имели в виду DATETIME, а не TIMESTAMP? SQL Server сделал большую ошибку, когда они назвали тип TIMESTAMP - в то время как он * звучит *, как тип ANSI SQL, который представляет что-то, что связано с датой и временем, и это не имеет ничего общего. Попробуйте это в окне запроса, игнорируя все эти помехи VBA и Excel: 'SELECT CAST (GETDATE() AS TIMESTAMP);' –

+1

Кроме того, вам никогда не придется говорить «Я не знаю, какую версию я запускаю», - это тривиально, чтобы получить с помощью 'SELECT @@ VERSION;'. –

+0

Вероятно, это проблема с форматированием Excel. Попробуйте изменить формат столбцов столбцов даты на «yyyy-mm-dd hh: mm: ss» – Vasanth

ответ

1

Ник, я думаю, я нашел решение для вас :)
Позвольте мне продемонстрировать, используя мои данные выборки.
По умолчанию Excel не имеет формата ячейки DateTime. Это означает, что он не может хранить дату и время в одной ячейке. Когда дело доходит до представления данных, кажется, что Excel пытается использовать только самый узнаваемый формат - дату. Он по-прежнему сохраняет время, но форматирует ячейки в формат даты, теряя/, отбрасывая время.

Посмотрите на скриншот ниже:
sample
Как вы можете видеть данные, отображаемые в ячейке выглядит так же, как обычный день. Но если вы посмотрите на панель формул - время существует, но не отображается.

В конце кода, я добавил Debug.Print линию:
Debug.print Range("B6").Value & vbCrlf & Range("B6").Value2
результаты я получил
25/06/2013 16:00:27
41450.6669791667
Поэтому я сообразуйтесь, что , что вы видите в ячейка в Excel не совсем то, к чему она относится,


The ne Шаг xt заключался в том, чтобы написать функцию, которая будет перебирать ячейки и изменять форматирование и то, что видно.
Чтобы достичь обоих: date и time в одной ячейке, я решил отформатировать ячейку как Text.

Private Sub FormatDateAndTime(ByRef sheet As Worksheet, start As Long, column As String) 
    Dim i As Long, rng As Range 
    For i = start To sheet.Range(column & Rows.Count).End(xlUp).Row 
     Set rng = sheet.Range(column & i) 
     Dim str As String 
     str = Split(rng.Value, " ")(0) & " " & Split(rng.Value, " ")(1) 
     rng.NumberFormat = "@" 
     rng = str 
     Set rng = Nothing 
    Next i 
End Sub 

FormatDateAndTime() функция принимает 3 параметра:
- активный лист
- начиная ряд
- столбец с датами
Для вызова функции добавьте эту строку прямо перед End Sub в коде

// Copy Data to Excel 
     theSheet.Range("A6").CopyFromRecordset objMyRecordset 

    // this is the line you want to add 
    FormatDateAndTime sheet:=theSheet, start:=6, column:="A" 

End Sub 

примечание:меня отправить другие параметры в моем образце demontrate результатов, но выше будут работать в вашем случае

Ok, после выполнения кода Вы должны получить результаты следующего
примечания:Я провел это только для столбца B в своем примере, чтобы показать разницу.

results1
примечание: Я побежал этот для обеих колонн B и C results2


Ваше полное решение:

Sub Populate_Sheet(theSheet As Worksheet) 

'Declare variables' 
    Dim objMyConn As ADODB.Connection 
    Dim objMyCmd As ADODB.Command 
    Dim objMyRecordset As ADODB.Recordset 
    Set objMyConn = New ADODB.Connection 
    Set objMyCmd = New ADODB.Command 
    Set objMyRecordset = New ADODB.Recordset 

    Dim executeThisSQLStatement As String 
    'Dim target As Worksheet 
    'Set target = theSheet 

    executeThisSQLStatement = "SELECT CAST(DateHour_CPT AS TIMESTAMP) FROM EnergyData_v" 

'Open Connection' 
    objMyConn.ConnectionString = "driver={SQLServer};Data Source=DataMart;User ID=acctname.value;Password=mypass.value;" 

    objMyConn.Open 

'Set and Excecute SQL Command' 
    Set objMyCmd.ActiveConnection = objMyConn 
    objMyCmd.CommandText = executeThisSQLStatement 
    objMyCmd.CommandType = adCmdText 

'Open Recordset' 
    Set objMyRecordset.Source = objMyCmd 
    objMyRecordset.Open 

'Copy Data to Excel' 
    Range("A6").CopyFromRecordset objMyRecordset 

    FormatDateAndTime sheet:=theSheet, start:=6, column:="A" 
End Sub 

Private Sub FormatDateAndTime(ByRef sheet As Worksheet, start As Long, column As String) 
    Dim i As Long, rng As Range 
    For i = start To sheet.Range(column & Rows.Count).End(xlUp).Row 
     Set rng = sheet.Range(column & i) 
     Dim str As String 
     str = Split(rng.Value, " ")(0) & " " & Split(rng.Value, " ")(1) 
     rng.NumberFormat = "@" 
     rng = str 
     Set rng = Nothing 
    Next i 
End Sub 


Если этот ответ помог вам, пожалуйста, примите и/или повысьте его! :) Спасибо и удачи

+1

Я скопировал ваш код, и он сработал отлично с первой попытки. Огромное спасибо. Это очень помогло мне! Я не могу поддержать, потому что у меня недостаточно репутации, но это именно то, что мне нужно. – NickVise

+0

рад, что я мог помочь. –

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