通过VBA更改date格式为SQL查询
我有一个问题,我没有能够回答到目前为止,我的问题是,我有一个使用SQL查询来访问SQL数据库和拉取信息的macros。 在excel中,它总是强制date到DD / MM / YYYY(你可以强制格式化,但是当它传递给SQL的东西时,它仍然以DD / MM / YYYY出现,即使格式看上去是正确的)。
我已经尝试了一些更改我的代码,试图“强制”,但我没有运气,我复杂化,还是不应该这样做呢? 大声笑。
我将提供我的VB代码和“属性”,看看使用macros所产生的“连接”是什么样的。
请注意,格式需要是YYYY-MM-DD,因为这是它存储在数据库中的方式。 目前解决这个问题的唯一方法就是使用date的“inf”,例如“2013-12-01”来强制它,否则就会到2013年12月1日。
有任何想法吗? 我一直在绞尽脑汁,因为太久了。
问候杰米
如果需要该信息,则服务器是SQLEXPRESS服务器。
代码如下:
Sub CustomisedSQLQuery() ' ' SQL Query to allow user customisation. ' ' Dim FileName As String Dim User As String Dim StartDate As String Dim EndDate As String Dim Category As String Dim Confirm As Variant Confirm = MsgBox("Have you made sure that at least one of the search criteria's is populated? If so your excel may crash or you may kill the database.", vbQuestion + vbYesNo, "Wait....") If Confirm = vbNo Then ActiveWorkbook.Sheets("Input Sheet").Activate If Confirm = vbNo Then Exit Sub FileName = Worksheets("Input Sheet").Cells(10, 1) User = Worksheets("Master DATA").Cells(1, 1) StartDate = Worksheets("Input Sheet").Cells(10, 3) EndDate = Worksheets("Input Sheet").Cells(10, 4) Category = Worksheets("Master DATA").Cells(1, 5) MyStr = Format(StartDate, "yyyy/mm/dd") MyStr = Format(EndDate, "yyyy/mm/dd") Sheets("Output Sheet").Select Cells.Select Selection.ClearContents Range("A1").Select With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _ "ODBC;DRIVER=SQL Server;SERVER=SERVERADDRESS;UID=USERNAME;PWD=PASSWORD;APP=Microsoft Office 2010;WSID=ID" _ , Destination:=Range("$A$1")).QueryTable .CommandText = Array( _ "SELECT DocumentsRead.userID, DocumentsRead.fileName, DocumentsRead.category, DocumentsRead.downloadedByUser, DocumentsRead.timeDownloaded, DocumentsRead.timeR" _ , _ "ead" & Chr(13) & "" & Chr(10) & "FROM EndUsers.dbo.DocumentsRead DocumentsRead" & Chr(13) & "" & Chr(10) & "WHERE (DocumentsRead.fileName Like '" & FileName & "') AND (DocumentsRead.category='" & Category & "') AND (DocumentsRead.timeRead Is Null) " _ , "AND (DocumentsRead.timeDownloaded Between {ts '" & StartDate & " 00:00:01'} An" _ , "d {ts '" & EndDate & " 00:00:01'})") .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = True .Refresh BackgroundQuery:=False End With Sheets("Input Sheet").Select End Sub
这是来自SQL的连接属性
SELECT DocumentsRead.userID, DocumentsRead.fileName, DocumentsRead.category, DocumentsRead.downloadedByUser, DocumentsRead.timeDownloaded, DocumentsRead.timeRead FROM EndUsers.dbo.DocumentsRead DocumentsRead WHERE (DocumentsRead.fileName Like 'GB') AND (DocumentsRead.category='Notices') AND (DocumentsRead.timeRead Is Null) AND (DocumentsRead.timeDownloaded Between {ts '01/12/2013 00:00:01'} And {ts '08/11/2013 00:00:01'})
input表格如下所示:
它看起来像你的问题是格式的StartDate / EndDate。 这是你的代码:
MyStr = Format(StartDate, "yyyy/mm/dd") MyStr = Format(EndDate, "yyyy/mm/dd")
这是我想你想要做的事情:
StartDate = Format(StartDate, "yyyy-mm-dd") EndDate = Format(EndDate, "yyyy-mm-dd")
我相信你也可以告诉访问string是通过包裹在#中的date。 如
"and DocumentsRead.timeDownloaded >= #" & StartDate & "#" & vbcrlf & _ "and DocumentsRead.timeDownloaded < #" & EndDate & "#"