【问题标题】:Trying to convert the date of a column to be mmddyyyy when it is yyyymmdd while in a table with other columns尝试将列的日期转换为 mmddyyyy 当它是 yyyymmdd 而在具有其他列的表中时
【发布时间】:2014-04-09 21:19:41
【问题描述】:

我在尝试将列的日期转换为标准 MMDDYYYY 格式时遇到问题。

例如我有一个数据如下的表:

ID   |   Date   |   Type   |
----------------------------
1    | 20140308 | License  |
2    | 20140308 | License  |
3    | 48       | License  |

我想要得到的结果是:

ID   |   Date      |   Type   |
-------------------------------
1    | 3-8-2014    | License  |
2    | 3-8-2014    | License  |
3    | 48(not sure)| License  |

当我有垃圾数据进入系统时,这可能吗?当我尝试将日期转换为 MMDDYYYY 时,我不断收到这样的错误。

Msg 241, Level 16, State 1, Line 1 转换时转换失败 字符串中的日期和/或时间。警告:空值是 通过聚合或其他 SET 操作消除。

【问题讨论】:

  • 你能发布试图进行转换的 SQL 脚本吗?
  • 选择不同的ID,convert(varchar(10),convert(date,DATECOLUMN),101)
  • @JaronCook 看看我的解决方案我使用了ISDATE() 函数,如果传递的参数值是日期值,则返回 1,否则返回 0。既然您提到您的专栏中可能有一些垃圾数据,我认为这是最安全的处理方式。

标签: sql sql-server


【解决方案1】:

这个呢……

测试数据

DECLARE @Table TABLE(ID INT,[Date] VARCHAR(8),[Type] VARCHAR(20))
INSERT INTO @Table VALUES
(1,'20140308','License'),
(2,'20140307','License'),
(3,'48'      ,'License')

查询

SELECT ID 
      ,CASE WHEN ISDATE([Date]) = 1
                THEN CONVERT(VARCHAR(10), CAST([DATE] AS DATE), 110)
            ELSE NULL END AS [Date]
      ,[Type]
FROM @Table

结果集

╔════╦════════════╦═════════╗
║ ID ║    Date    ║  Type   ║
╠════╬════════════╬═════════╣
║  1 ║ 03-08-2014 ║ License ║
║  2 ║ 03-07-2014 ║ License ║
║  3 ║ NULL       ║ License ║
╚════╩════════════╩═════════╝

【讨论】:

  • 请注意,如果您的 Date 列是 int 数据类型,那么您需要在转换为日期之前强制转换为 varchar,否则您将收到错误消息“显式转换不允许从数据类型 int 到日期”。示例:THEN CONVERT(VARCHAR(10), CAST(CONVERT(VARCHAR(10),[DATE]) AS DATE), 110)
  • @BateTech 这是不正确的我在case语句中使用了ISDATE()函数,如果它是日期值,它只会尝试将其转换为DATE,否则它只会返回null,我是打算创建一个 sql fiddle 来证明这一点,但它似乎失败了,你自己试试吧:)
  • 您说ISDATE 函数与int 一起使用是正确的,并且对于20140308 的int 将返回true,但我说的是CONVERTCAST 来自迄今为止。试试这个,你会看到我指的是什么错误DECLARE @date int; SET @date = 20140308; select CASE WHEN ISDATE(@date) = 1 THEN CONVERT(VARCHAR(10), CAST(@date AS DATE), 110) ELSE NULL END;,它会给出一个错误,但这会起作用:DECLARE @date int; SET @date = 20140308; select CASE WHEN ISDATE(@date) = 1 THEN CONVERT(VARCHAR(10), CAST(CONVERT(VARCHAR(10), @date) AS DATE), 110) ELSE NULL END;
  • 如果 4 位数年份是唯一值,IsDate 也将返回 true。如果您不希望将 4 位数的年份视为有效日期,因为您期望 YYYYMMDD 格式,那么您可以将 WHEN ISDATE([Date]) = 1 更改为 WHEN ISDATE([Date]) = 1 AND LEN([Date]) = 8 以仅接受 YYYYMMDD 格式有效。否则,将 4 位数年份转换为日期将假定 1 月 1 日为月和日。
  • 感谢您的帮助。我最终使用 'CASE WHEN ISDATE([DATE])=1 THEN CAST(CONVERT(VARCHAR(10), CAST([DATE] AS DATE), 101) AS DATE) ELSE NULL END AS Exp_Date' 来转换它返回一个日期,并在导出时使用它正确过滤到 Excel 电子表格中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 2020-05-07
  • 1970-01-01
  • 2018-03-31
  • 2014-07-29
  • 2018-06-18
  • 2021-06-08
相关资源
最近更新 更多