【问题标题】:Swap year and day in a Date in Access using SQL使用 SQL 在 Access 中的日期中交换年份和日期
【发布时间】:2018-04-05 12:25:48
【问题描述】:

我需要将数据从 csv 文件导入到 access 数据库中。我遇到的问题是访问会弄乱日期。

csv 文件中的日期格式在“29-SEP-17”行中。当它被导入访问时,它会将其翻译为 2029/09/17 - 基本上将日期的日期和年份部分混合在一起。

我可以通过在导入文件中的日期字段并将文件中的日期字段更改为短日期之前转到 Excel 来解决此问题,但我更愿意在导入到访问权限后使用表中所有日期字段的 SQL 查询来修改此问题。感谢您的帮助。

【问题讨论】:

    标签: sql csv date ms-access


    【解决方案1】:

    从 17 年 9 月 29 日起

    SELECT TO_DATE( (SUBSTR('29-SEP-17',1,7) || '20' || SUBSTR('29-SEP-17',8,2)) 
    ,'dd-MON-yyyy') FROM DUAL;
    

    将在'17'前面添加'20'以形成'2017',然后将字符串转换为DATE类型。

    2017-09-29 00:00:00(或者您系统的默认日期格式是)。 或者你也可以像这样使用 CONCAT:

    SELECT TO_DATE( CONCAT (SUBSTR(yourDate,1,7), '20', SUBSTR(yourDate,8,2)) ) 
            FROM yourTable; 
    

    【讨论】:

    • 感谢您的建议!我可以用日期字段名称替换“29-SEP-17”并用我的表名替换“DUAL”吗?我还弹出一个错误:查询表达式中垂直条的使用无效...
    • @asj 是的,你可以。 DUAL 仅用作示例。无论如何我更新了答案并替换 ||与CONCAT。虽然它应该双向工作。
    【解决方案2】:

    看起来提供的其余答案是针对 SQL Server 而不是 MS Access。最好的办法是编写自己的日期解析函数以获得最大的控制权并以最有意义的方式利用它(如果您使用 VBA、更新查询等解析 csv)

    这也可以在 MS Access 查询中使用。以下是就地日期格式更新的更新示例:

    UPDATE [MyTable] SET [MyTable].[MyDateToConv] = MyDateParse([MyTable].[MyDateToConv])
    
    Public Sub TestParse()
    
        Debug.Print MyDateParse("29-SEP-17") '9/29/2017
    
    End Sub
    
    Public Function MyDateParse(val As Variant) As Variant
    
        Dim dPart As Variant
        Dim mVal As Long
    
        If IsNull(val) Then
            MyDateParse = Null
            Exit Function
        End If
    
        dPart = Split(val, "-")
    
        If UBound(dPart) <> 2 Then
            'value isn't of format ##-XXX-## handle how you please
        End If
    
        Select Case Trim(UCase(dPart(1))) 'select case based on the month
            Case "JAN"
                mVal = 1
            Case "FEB"
                mVal = 2
            Case "MAR"
                mVal = 3
            Case "APR"
                mVal = 4
            Case "MAY"
                mVal = 5
            Case "JUN"
                mVal = 6
            Case "JUL"
                mVal = 7
            Case "AUG"
                mVal = 8
            Case "SEP"
                mVal = 9
            Case "OCT"
                mVal = 10
            Case "NOV"
                mVal = 11
            Case "DEC"
                mVal = 12
            Case Else
                'however you want to handle this error
        End Select
    
        MyDateParse = DateSerial(dPart(2), mVal, dPart(0))
    End Function 
    

    【讨论】:

    • 让 OP 知道他/她可以在 MS Access 查询中调用此用户定义的方法。
    【解决方案3】:

    使用导入向导导入您的数据。

    在此,单击高级并将日期顺序指定为DMY,然后将字段的数据类型从短文本日期/时间

    现在您可以立即导入数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多