【问题标题】:Converting the date and time column into an SQL format date and time将日期和时间列转换为 SQL 格式的日期和时间
【发布时间】:2019-10-20 20:19:36
【问题描述】:

我想将日期和时间字符串更新/转换为 SQL 日期和时间格式,即它看起来完全相同,但它不会读取为 nvarchar,而是读取为日期和时间。

Date            Time
20-10-2019  12:00:00
20-10-2019  11:00:00
20-10-2019  10:00:00
20-10-2019  09:00:00
20-10-2019  08:00:00
20-10-2019  07:00:00

我使用 pandas 从一个站点收集了这些数据,将其转换为数据框,然后将其插入到 MSSQL 服务器中,其中已经创建了一个表。

到目前为止我已经这样做了

SELECT CONVERT (date,'19-10-2019') as Date
SELECT CONVERT (time,'17:00:00',120) as Time;

但这只会转换一列,而我想转换整列,并将其另存为另一列(我也是这样做的)。

alter table <table_name>
add <col_name> date

alter table <table_name>
add <col_name> time

谁能帮帮我,因为我在网上搜索了一段时间,并没有得到适当的结果,我大多得到这个错误:

'''从字符串转换日期和/或时间时转换失败。'''

【问题讨论】:

  • 如果我冒昧地猜测一下,这会给您带来问题,因为它期望日期格式为MM-dd-yyyy,但您的日期中的20 不是有效月份。尝试解决这个问题。

标签: sql sql-server


【解决方案1】:

您可以按样式 105 转换日期。CAST and CONVERT

CONVERT(DATE, '20-10-2019', 105), CONVERT(TIME, '12:00:00')

对于更新所有行

UPDATE table SET NewDateColumn = CONVERT(DATE, [Date], 105), 
                 NewTimeColumn = CONVERT(TIME, [Time])

【讨论】:

  • 最后一条语句给了我这个输出:从字符串转换日期和/或时间时转换失败。
  • 但是这个问题只是时间问题,而不是日期问题。日期转换工作正常。
  • 您的时间文本似乎为空或无效。
  • 时间文本是这样的12:00:00,'Time'列不为空。但是,新列 (Converted_time) 设置为 null(因为我使用了 ALTER 表)。
【解决方案2】:

首先,列中有错误数据。你应该找到那个。您可以使用:

SELECT t.*
FROM t
WHRE TRY_CONVERT(date, t.datecol) IS NULL OR 
     TRY_CONVERT(time, t.timecol) IS NULL;

注意:您可能希望为 date 转换添加格式,但如果默认方法有效(在您的情况下似乎如此),则可能没有必要。

一旦数据被修复,或者您决定对错误值的 NULL 值感到满意,那么您有两个选择。

您可以添加计算列:

alter table t add real_date as (try_convert(date, t.datecol));
alter table t add real_time as (try_convert(time, t.timecol));

或者,您可以更改适当的列:

-- first convert to default string formats
update t
    set datecol = try_convert(date, t.datecol),
        timecol  = try_convert(time, t.timecol);

-- then alter the types
alter t alter column datecol date;
alter t alter column timecol time;

【讨论】:

    【解决方案3】:

    要将字符串日期或时间转换为日期和时间格式,

    SELECT TRY_CONVERT(date, '20-10-2019', 105) as [Date], TRY_CAST('12:00:00' AS TIME) as [Time]
    

    更新

    UPDATE table SET datecol = TRY_CONVERT(DATE, DateString, 105), 
                     timecol = TRY_CAST(TimeString AS time)
    

    【讨论】:

    • 它确实转换了它,但不是整个列。因为,我已经尝试过了,数据保持不变。它显示了一行更改的数据,仅此而已。我使用 [table_name] 中的 SELECT * 进行了检查。
    猜你喜欢
    • 1970-01-01
    • 2013-03-24
    • 2016-11-26
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2012-08-03
    • 2016-06-07
    相关资源
    最近更新 更多