【问题标题】:Convert NULL datetime to Blank将 NULL 日期时间转换为空白
【发布时间】:2014-10-09 15:14:08
【问题描述】:

我想将日期时间字段转换为 varchar,以便在日期为 NULL 时显示空白或消息。 这是我目前所拥有的:

select
isnull(us.Date,0) as USDate,
isnull(au.Date,0) as AUDate
from ustable us
left join autable au
on us.column=au.column

现在显示的是:

USDATE 
2014-10-24 10:29:07.450
1900-01-01 00:00:00.000

我希望能够制作“1900-01-01 00:00:00.000”varchar,这样我就可以写一条消息或显示一个真正的空白。

【问题讨论】:

  • 我建议在前端而不是在 sql 中进行这种类型的格式化。让您的应用程序处理显示。

标签: sql sql-server datetime null


【解决方案1】:

我发现的最简单的代码行如下所示。

ISNULL(CONVERT(VARCHAR(30),us.Date,121),'') as USDate,
ISNULL(CONVERT(VARCHAR(30),au.Date,121),'') as AUDate,

我已经对此进行了测试并确认它有效。

【讨论】:

    【解决方案2】:

    你可以像这样使用Case AND CONVERT -

    SELECT
    CASE WHEN us.Date IS NULL THEN '' ELSE CONVERT(VARCHAR(30), us.Date, 121) END AS USDate,
    CASE WHEN au.Date IS NULL THEN '' ELSE CONVERT(VARCHAR(30), au.Date, 121) END AS AUDate
    FROM ustable us
    left join autable au
    on us.column=au.column
    

    【讨论】:

    • 这实际上会输出1900-01-01 00:00:00.000
    • 第二个CASE 缺少END 吗?
    【解决方案3】:

    在 SQL 中执行:

    更改您的 SELECT 语句以包含 WHEN...THEN 子句:

    CASE us.Date 
      WHEN '1900-01-01 00:00:00.000' THEN ''
      WHEN NULL THEN ''
      ELSE us.Date
    END as USDate,
    CASE au.Date 
      WHEN '1900-01-01 00:00:00.000' THEN ''
      WHEN NULL THEN ''
      ELSE au.Date
    END as AUDate
    

    如果您有前端代码,那么您可以只在前端实现功能而无需更改您的 SQL 代码。

    【讨论】:

    • 两个问题:(1)当表中的日期为 NULL 时,他们想要一个空字符串,而不是 1900-01-01(2)即使日期实际上有一个有效值( 1900-01-01 除外)。
    • 你是对的。我当时无法对此进行测试,因为我无权访问 SQL。
    【解决方案4】:

    给定这样定义的列:

    date_of_birth datetime null
    

    你可以简单地说

    select date_of_birth = coalesce( convert(varchar(32),date_of_birth) , '' )
    from some_table_with_a_nullable_datetime_column
    

    【讨论】:

      【解决方案5】:

      你可以使用 NVL() 函数...

      您可以使用 NVL 函数来转换计算结果的表达式 NULL 为您指定的值。 NVL 函数接受两个 参数:第一个参数采用表达式的名称 评估;第二个参数指定函数的值 当第一个参数的计算结果为 NULL 时返回。如果第一个 参数不计算为 NULL,函数返回值 第一个参数。

      例如:

      select
      nvl(us.Date,'') as USDate,
      nvl(au.Date,'') as AUDate
      from ustable us
      left join autable au
      on us.column=au.column
      

      或者把你想要的任何东西作为默认值:

      select
      nvl(us.Date,'this was a NULL') as USDate,
      nvl(au.Date,'this was a NULL') as AUDate
      from ustable us
      left join autable au
      on us.column=au.column
      

      【讨论】:

      • OP 表示这是 SQL Server (MS)。 NVL 是一个 Oracle 函数。
      【解决方案6】:

      试试这样的...

      select
      CONVERT(varchar(50), isnull(us.Date,0)) as USDate,
      CONVERT(varchar(50), isnull(au.Date,0)) as AUDate
      from ustable us
      left join autable au
      on us.column=au.column
      

      您需要根据日期格式更改 varchar 的大小。此外,CONVERT 采用第三个参数,可让您更改字符串的格式。

      【讨论】:

      • 这会在我的系统上返回Jan 1 1900 12:00AM,而不是''
      • "isnull(us.Date,0)" 应该返回一个整数零。然后 Convert 语句应将其转换为字符串“0”。如果将 IsNull 语句的第二个参数替换为空字符串会得到什么?
      • 如果us.Date 是日期/日期时间等,则不是。您尝试过吗?
      • 道歉。我跑了,“SELECT CONVERT(VARCHAR(50), ISNULL(Null,0));”并得到了我的答案。当 null 来自日期时间列或变量而不是硬编码值时,这实际上是不同的。
      【解决方案7】:
      select null USDate, NUll AUDate
      from ustable us
      left join autable au on us.column=au.column
      

      试一试,它会显示列值应该为空。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 2021-02-03
        • 1970-01-01
        相关资源
        最近更新 更多