【问题标题】:Convert NVARCHAR to DATETIME in SQL Server 2008在 SQL Server 2008 中将 NVARCHAR 转换为 DATETIME
【发布时间】:2013-10-07 07:14:26
【问题描述】:

在我的桌子上

LoginDate  
2013-08-29 13:55:48  

loginDate 列的数据类型是nvarchar(150)

我想使用 SQL 命令将logindate 列转换为日期时间格式

预期结果。

LoginDate  
29-08-2013 13:55:48

【问题讨论】:

  • 始终尝试使用日期时间字段作为日期时间值
  • "Click a Tick" 接受答案,因为某个答案确实解决了您的问题,或者对找到您的解决方案最有帮助(注意:您可以再次单击以撤消)。接受答案表明问题已得到解决,这可以在寻找解决方案或寻找要解决的问题时节省其他人的时间。

标签: sql datetime sql-server-2008-r2 nvarchar


【解决方案1】:
DECLARE @chr nvarchar(50) = (SELECT CONVERT(nvarchar(50), GETDATE(), 103))

SELECT @chr chars, CONVERT(date, @chr, 103) date_again

【讨论】:

  • 这个答案可能需要一些澄清。本质上,答案是使用函数“CONVERT(date”
【解决方案2】:

由于您的数据是 nvarchar,因此无法保证它会转换为日期时间(因为它可能包含无效的日期/时间信息) - 因此处理此问题的一种方法是使用我将在交叉应用中使用的 ISDATE。 (交叉应用结果是可重用的,因此输出格式更容易。)

|                     YOUR_DT |             SQL2008 |
|-----------------------------|---------------------|
|         2013-08-29 13:55:48 | 29-08-2013 13:55:48 |
|    2013-08-29 13:55:48 blah |              (null) |
| 2013-08-29 13:55:48 rubbish |              (null) |

SELECT
  [Your_Dt]
, convert(varchar, ca1.dt_converted ,105) + ' ' + convert(varchar, ca1.dt_converted ,8) AS sql2008
FROM your_table
CROSS apply ( SELECT CASE WHEN isdate([Your_Dt]) = 1
                        THEN convert(datetime,[Your_Dt])
                        ELSE NULL
                     END
            ) AS ca1 (dt_converted)
;

注意事项:

您还可以引入 left([Your_Dt],19) 以仅从 '2013-08-29 13:55:48 rubbish' 中获取类似 '2013-08-29 13:55:48' 的字符串

对于该特定输出,我认为您将需要 2 个 sql 2008 日期样式(105 和 8) 添加sql2012进行比较

declare @your_dt as datetime2
set @your_dt = '2013-08-29 13:55:48'

select
  FORMAT(@your_dt, 'dd-MM-yyyy H:m:s') as sql2012
, convert(varchar, @your_dt ,105) + ' ' + convert(varchar, @your_dt ,8) as sql2008

|             SQL2012 |             SQL2008 |
|---------------------|---------------------|
| 29-08-2013 13:55:48 | 29-08-2013 13:55:48 | 

【讨论】:

    【解决方案3】:
    alter table your_table
    alter column LoginDate datetime;
    

    SQLFiddle demo

    【讨论】:

    • 我无权更改列。
    【解决方案4】:
    SELECT CONVERT(NVARCHAR, LoginDate, 105)+' '+CONVERT(NVARCHAR, LoginDate, 108) AS LoginDate FROM YourTable
    
    Output
    -------------------
    29-08-2013 13:55:48
    

    【讨论】:

    • 不正确。 OP 询问如何将 NVARCHAR 转换为 日期值,而您正在展示如何将 DATE 转换为 NVARCHAR。
    【解决方案5】:

    你到底不想做什么?要更改列的数据类型,您可以简单地使用 alter 命令作为

    ALTER TABLE table_name ALTER COLUMN LoginDate DateTime;

    但请记住,只有在此列中才应该有有效的日期,但是数据类型是 nvarchar。

    如果你不想在获取数据时转换数据类型,那么你可以使用 CONVERT 函数,

    CONVERT(data_type(length),expression,style)

    例如:

    SELECT CONVERT(DateTime, loginDate, 6)

    这将返回 29 AUG 13。有关 CONVERT 函数的详细信息,您可以访问,

    http://www.w3schools.com/sql/func_convert.asp.

    记住,DateTime 列始终使用 DataTime 数据类型。

    谢谢

    【讨论】:

    • 我无权更改列。我想格式化输出
    • 那么您可以使用CONVERT函数。您可以在上面的示例中使用3或113而不是6作为您在上述问题中所需的日期格式。
    【解决方案6】:

    这个呢

    --// Convert NVARCHAR to DATETIME
    DECLARE @date DATETIME = (SELECT convert(DATETIME, '2013-08-29 13:55:48', 120))
    --// Convert DATETIME to custom NVARCHAR FORMAT
    SELECT 
    RIGHT('00'+ CAST(DAY(@date) AS NVARCHAR),2) + '-' +
    RIGHT('00'+ CAST(MONTH(@date) AS NVARCHAR),2) + '-' + 
    CAST(YEAR(@date) AS NVARCHAR) + ' ' + 
    CAST(CONVERT(TIME,@date) AS NVARCHAR)
    

    结果:'29-08-2013 13:55:48.0000000'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2011-06-24
      相关资源
      最近更新 更多