You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Олег Лебедев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 17:55:17