SQL-将数据类型varchar DD/MM/YYYY转换为SQL中的日期格式

SQL-将数据类型varchar DD/MM/YYYY转换为SQL中的日期格式,sql,excel,vba,azure,date,Sql,Excel,Vba,Azure,Date,我正在开发Azure SQL数据库 我正在尝试将包含dd/mm/yyyy格式日期的字段数据类型从varchar(100)转换为日期字段。我运气不好 任何帮助都将不胜感激。我不是sql专家,但使用Microsoft sql server管理 我的列名是Eventdate,表名是customers 我试过了,但我肯定我做错了什么 Select Eventdate Where Customers SELECT convert(varchar(100),Eventdate,101) 编辑: 虽然将va

我正在开发Azure SQL数据库

我正在尝试将包含dd/mm/yyyy格式日期的字段数据类型从varchar(100)转换为日期字段。我运气不好

任何帮助都将不胜感激。我不是sql专家,但使用Microsoft sql server管理

我的列名是Eventdate,表名是customers

我试过了,但我肯定我做错了什么

Select Eventdate
Where Customers
SELECT convert(varchar(100),Eventdate,101)
编辑:

虽然将varchar列更改为datetime的答案很有效,但我现在遇到了另一个问题。我将更详细地介绍数据库正在做什么

我有一个excel电子表格,其中包含以下vba代码,用于连接到sql数据库并将数据插入sql数据库

首先将其发送到名为“MergeCustomers”的SQL表,检查重复的KeyID字段(JobCode),然后将其放入“Customer”表中

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    Dim conn As New ADODB.Connection
    Dim iRowNo As Integer
    Dim sCustomerId, sFirstName, sLastName As String


    With Sheets("sql")

        'Open a connection to SQL Server
        conn.Open "Provider=SQLOLEDB;Data Source=tcp:SERVERADDRESS,1433;Initial Catalog=Sales;Persist Security Info=False;User ID=USER;Password=PASSWORD;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"


        'Skip the header row
        iRowNo = 2

        'Loop until empty cell in CustomerId
        Do Until .Cells(iRowNo, 1) = ""
            sJobcode = .Cells(iRowNo, 1)
            sEventstatus = .Cells(iRowNo, 2)
            sVenue = .Cells(iRowNo, 3)
            sGuestno = .Cells(iRowNo, 4)
            sEventtype = .Cells(iRowNo, 5)
            sClient = .Cells(iRowNo, 6)
            sEventdate = .Cells(iRowNo, 7)
            sCommission = .Cells(iRowNo, 8)
            sEventvalue = .Cells(iRowNo, 9)
            sEventmargin = .Cells(iRowNo, 10)
            sAccountman = .Cells(iRowNo, 11)

            'Generate and execute sql statement to import the excel rows to SQL Server table
            conn.Execute "insert into dbo.CustomersStage (Jobcode, Eventstatus, Venue, Guestno, Eventtype, Client, Eventdate, Commission, Eventvalue, Eventmargin, Accountman) values ('" & sJobcode & "', '" & sEventstatus & "', '" & sVenue & "', '" & sGuestno & "', '" & sEventtype & "', '" & sClient & "', '" & sEventdate & "', '" & sCommission & "', '" & sEventvalue & "', '" & sEventmargin & "', '" & sAccountman & "')"

            iRowNo = iRowNo + 1
        Loop

        conn.Execute "EXEC dbo.MergeCustomers"

        MsgBox "File saved and data successfully uploaded to the cloud"

        conn.Close
        Set conn = Nothing

    End With

End Sub
更改MergeCustomers和Customers sql表中的“Eventdate”列后,在excel中运行VBA代码时,我遇到以下错误:

“将varchar数据类型转换为datetime数据类型导致值超出范围”

我想我需要更改excel文件的输出以匹配sql数据类型的更改

我已经复制了在下面的SQL上运行的合并过程

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[MergeCustomers] AS

SET NOCOUNT ON

MERGE dbo.Customers AS Trgt
USING dbo.CustomersStage Src
    ON Trgt.Jobcode  = Src.Jobcode
WHEN NOT MATCHED BY TARGET THEN
    INSERT (Jobcode, Eventstatus, Venue, Guestno, Eventtype, Client, Eventdate, Commission, Eventvalue, Eventmargin, Accountman)
    VALUES (Src.Jobcode, Src.Eventstatus, Src.Venue, Src.Guestno, Src.Eventtype, Src.Client, Src.Eventdate, Src.Commission, Src.Eventvalue, Src.Eventvalue, Src.Accountman)
WHEN MATCHED AND
    (
        ISNULL(Trgt.Eventstatus, '') <> ISNULL(Src.Eventstatus, '')
    OR
        ISNULL(Trgt.Venue, '') <> ISNULL(Src.Venue, '')
    OR
        ISNULL(Trgt.Guestno, '') <> ISNULL(Src.Guestno, '')
    OR
        ISNULL(Trgt.Eventtype, '') <> ISNULL(Src.Eventtype, '')
    OR
        ISNULL(Trgt.Client, '') <> ISNULL(Src.Client, '')
    OR
        ISNULL(Trgt.Eventdate, '') <> ISNULL(Src.Eventdate, '')
    OR
        ISNULL(Trgt.Commission, '') <> ISNULL(Src.Commission, '')
    OR
        ISNULL(Trgt.Eventvalue, '') <> ISNULL(Src.Eventvalue, '')
    OR
        ISNULL(Trgt.Eventmargin, '') <> ISNULL(Src.Eventmargin, '')
    OR
        ISNULL(Trgt.Accountman, '') <> ISNULL(Src.Accountman, '')
    )
THEN
    UPDATE SET Eventstatus = Src.Eventstatus, Venue = Src.Venue, Guestno = Src.Guestno, Eventtype = Src.Eventtype, Client = Src.Client, Eventdate = Src.Eventdate, Commission = Src.Commission, Eventvalue = Src.Eventvalue, Eventmargin = Src.Eventmargin, Accountman = Src.Accountman
    ;

DELETE FROM dbo.CustomersStage
将ANSI_空值设置为ON
去
在上设置带引号的\u标识符
去
将过程[dbo].[MergeCustomers]更改为
不计较
将dbo.Customers合并为Trgt
使用dbo.CustomersStage Src
在Trgt.Jobcode=Src.Jobcode上
当目标不匹配时
插入(工作代码、事件状态、地点、访客号、事件类型、客户、事件日期、佣金、事件值、事件保证金、会计人员)
值(Src.Jobcode、Src.Eventstatus、Src.vention、Src.Guestno、Src.Eventtype、Src.Client、Src.Eventdate、Src.Commission、Src.Eventvalue、Src.Eventvalue、Src.Accountman)
当匹配和
(
ISNULL(Trgt.Eventstatus“”)ISNULL(Src.Eventstatus“”)
或
ISNULL(Trgt.venture“”)ISNULL(Src.venture“”)
或
ISNULL(Trgt.Guestno“”)ISNULL(Src.Guestno“”)
或
ISNULL(Trgt.Eventtype“”)ISNULL(Src.Eventtype“”)
或
ISNULL(Trgt.Client“”)ISNULL(Src.Client“”)
或
ISNULL(Trgt.Eventdate“”)ISNULL(Src.Eventdate“”)
或
ISNULL(Trgt.Commission“”)ISNULL(Src.Commission“”)
或
ISNULL(Trgt.Eventvalue“”)ISNULL(Src.Eventvalue“”)
或
ISNULL(Trgt.Eventmargin“”)ISNULL(Src.Eventmargin“”)
或
ISNULL(Trgt.Accountman“”)ISNULL(Src.Accountman“”)
)
然后
更新集Eventstatus=Src.Eventstatus,vention=Src.Venue,Guestno=Src.Guestno,Eventtype=Src.Eventtype,Client=Src.Client,Eventdate=Src.Eventdate,Commission=Src.Commission,Eventvalue=Src.Eventvalue,Eventmargin=Src.Eventmargin,Accountman=Src.Accountman
;
从dbo.CustomersStage中删除
只是确认一下

您是否希望通过SQL语句将日期从
VARCHAR
转换为
date
格式来查看日期?或者完全修改列的数据类型

编辑:

您能否提供更多关于您的表格的信息,以及已有的一两行数据

可能的解决方案:

我将在黑暗中试探一下,没有进一步的细节

试试这个:

SET DATEFORMAT dmy
ALTER TABLE Customers
ALTER COLUMN Eventdate DATETIME

使用sql中的convert函数来解决您的问题。下面是代码

--Create a sample table with EventDate column of varchar type 
Create Table Customers 
(
EventDate varchar(100)
)

Insert into Customers Values (GETDATE())

-- Declare a variable of varchar type to read customer table 
Declare @EventDate varchar(100)
Select @EventDate = EventDate from Customers


--Declare a new variable of the required data type of date  
Declare @EventDateInDateDataType Date 


-- use convert function to convert varchar to date format 
Select @EventDateInDateDataType = CONVERT(Date,@EventDate,101) 
Select @EventDateInDateDataType

你试过什么吗?还是?你遇到什么问题了吗?@SamMitchell。日期以内部格式存储,与字符串无关。因此,你的问题毫无意义。@GordonLinoff OP希望将文本字段转换为日期字段
,从varchar(100)转换为日期字段。
我希望完全修改数据类型列。列中的原始数据是varchar(100)@SamMitchell更新问题,并解释您想要做什么,您尝试了什么,问题出在哪里。抱歉-也要补充。该数据将不断更新,更多的varchar信息将被添加,所以我需要它修改数据的日期格式,因为它进入了sql@SamMitchell如果我理解正确,您可能需要考虑更改您的解决方案,将代码<>代码> > EngDebug <代码>中的更多数据< /代码>放在表中,首先是“代码> DATEIMECT/<代码>,而不是<代码> VARCHAR < /代码>?谢谢您的排序!非常感激