Excel转MS SQL日期格式异常:DD.MM.YYYY转为YYYY-DD-MM而非YYYY-MM-DD
解决Excel日期(DD.MM.YYYY)导入SQL Server后格式变为YYYY-DD-MM的问题
问题根源
你的代码直接将Excel单元格的日期赋值给字符串变量,再拼接成SQL插入语句。VBA会根据系统区域设置把日期转成字符串,而SQL Server解析这类字符串时,会默认按自身区域规则识别,导致日和月被颠倒,最终出现YYYY-DD-MM的错误格式。另外,直接拼接SQL还存在SQL注入风险,属于不安全的写法。
解决方案
推荐使用以下两种方法,优先选择参数化查询:
方法1:参数化查询(最安全可靠)
通过ADODB.Command传递参数,将日期以原生日期类型发送给SQL Server,完全避免格式解析问题,同时杜绝注入风险。
修改后的完整代码:
Sub Button1_Click() Dim conn As New ADODB.Connection Dim cmd As New ADODB.Command Dim iRowNo As Integer Dim smdm_id As String Dim date_start As Date, date_end As Date With Sheets("Ввод") ' 连接SQL Server conn.Open "Provider=SQLOLEDB;Server=actuar11;Database=marketing_sbx;Trusted_Connection=yes;Integrated Security=SSPI;" ' 清空目标表 conn.Execute "truncate table ol_del_export_from_excel_macro_mdm" ' 配置参数化插入命令 Set cmd.ActiveConnection = conn cmd.CommandText = "INSERT INTO dbo.ol_del_export_from_excel_macro_mdm (mdm_id, date_start, date_end) VALUES (?, ?, ?)" ' 定义参数类型 cmd.Parameters.Append cmd.CreateParameter("mdm_id", adVarChar, adParamInput, 50) ' 根据实际字段长度调整 cmd.Parameters.Append cmd.CreateParameter("date_start", adDate, adParamInput) cmd.Parameters.Append cmd.CreateParameter("date_end", adDate, adParamInput) ' 跳过表头行 iRowNo = 2 ' 循环插入数据 Do Until .Cells(iRowNo, 1) = "" smdm_id = .Cells(iRowNo, 1).Value date_start = .Cells(iRowNo, 2).Value date_end = .Cells(iRowNo, 3).Value ' 给参数赋值 cmd.Parameters("mdm_id").Value = smdm_id cmd.Parameters("date_start").Value = date_start cmd.Parameters("date_end").Value = date_end ' 执行插入 cmd.Execute iRowNo = iRowNo + 1 Loop MsgBox "Страхователи и даты импортированы." ' 清理资源 conn.Close Set cmd = Nothing Set conn = Nothing End With End Sub
方法2:格式化日期为SQL标准格式
如果暂时不想改参数化,也可以将Excel日期格式化为SQL Server能直接识别的ISO标准格式(YYYY-MM-DD),再拼接进SQL语句:
修改代码中获取日期的部分:
sdate_start = Format(.Cells(iRowNo, 2).Value, "yyyy-mm-dd") sdate_end = Format(.Cells(iRowNo, 3).Value, "yyyy-mm-dd")
这样插入的字符串是'2024-02-01',SQL Server会正确解析为YYYY-MM-DD格式。
注意事项
- 确保Excel单元格中的日期是真正的日期类型,而非文本格式(可通过单元格格式检查确认)。
- 永远优先使用参数化查询,避免SQL注入漏洞,同时彻底规避格式解析类问题。
内容的提问来源于stack exchange,提问作者Олег Лебедев
相关产品推荐
相关产品推荐

