首页 > 解决方案 > 如何将文本转换为在sql中作为日期输入的日期?

问题描述

数据类型为 TEXT 并输入为“20/11/2017”,当使用 MAX 或 MIN 时,它会忽略月份。我正在尝试将其转换为月份的日期格式以供考虑。

CAST AND CONVERT 似乎不起作用,因为以下错误返回

消息 241,级别 16,状态 1,第 13 行
从字符串转换日期和/或时间时转换失败。

代码:

SELECT     
    user_id, 
    record_id
    --CAST(onSale AS date) AS onSale
    --CONVERT(DATE, onSale) AS onSale, 
    --CONVERT(DATE, OffSale) AS OffSale
FROM (SELECT  user_id, 
             record_id,
             (SELECT MAX(value) AS Expr1
             FROM      UPLOADS.LINES AS SUH WITH (NoLock, ReadUncommitted)
             WHERE  (field_id = 4782) AND (record_id = UR.record_id)) AS onSale,
             (SELECT MAX(value) AS Expr1
             FROM      UPLOADS.LINES AS SUH WITH (NoLock, ReadUncommitted)
             WHERE  (field_id = 4783) AND (record_id = UR.record_id)) AS OffSale
        FROM   UPLOADS.RECORDS AS UR WITH (NoLock, ReadUncommitted)
        WHERE      (module_id = 18)) AS DATA;

最终结果基本上是 MAX 或 MIN 日期,所有三个组件都是日期、月份和年份。因此,如果用户输入了两个日期,即 17/05/2018 和 17/04/2018,那么如果使用 MAX,则应显示第一个日期。

标签: sqlsql-serverreporting-servicestype-conversion

解决方案


使用 CONVERT 时可以使用格式代码,甚至可以使用 TRY_CONVERT 来防止无效日期导致的错误。我还改进了您的代码,使其更简单、更高效。

SELECT  [user_id], 
        record_id,
        MAX(CASE WHEN SUH.field_id = 4782 THEN TRY_CONVERT( DATE, SUH.value, 103) END) AS onSale,
        MAX(CASE WHEN SUH.field_id = 4783 THEN TRY_CONVERT( DATE, SUH.value, 103) END) AS OffSale
FROM  UPLOADS.RECORDS AS UR 
JOIN  UPLOADS.LINES AS SUH ON SUH.record_id = UR.record_id
WHERE  module_id = 18
GROUP BY [user_id], 
        record_id;

推荐阅读