【问题标题】:How Does date time column behave when column contains empty value?当列包含空值时,日期时间列的行为如何?
【发布时间】:2019-09-21 20:17:06
【问题描述】:

我遇到了一些问题,当我将一个空值传递给日期时间变量时,它存储为默认日期(1900-01-01 00:00:00.000)

我写了一个条件语句

declare @l_date datetime = '',@l_date1 datetime = getdate()

if @l_date <> ''
   select 'Yes' as '@l_date',@l_date D
else
   select 'No' as '@l_date',@l_date D

if @l_date1 <> ''
    select 'Yes' as '@l_date1',@l_date1 D
else
    select 'No' as '@l_date1',@l_date1 D

我预计两者都应该返回“是”。不幸的是,第一个条件返回“否”,第二个条件返回“是”。谁能解释一下这个功能是如何工作的。

【问题讨论】:

  • 这可能是因为字符串自动转换为 INT 并且 SQL Server 为空字符串返回 0。您应该改用 NULL。
  • 谢谢@dnoeth。
  • 谢谢@Larnu

标签: sql sql-server tsql sql-server-2008-r2


【解决方案1】:

datetime 没有 '' 值。如您所见,'' 将被隐式转换为值19000101。如果您的日期未知,请使用NULL(毕竟NULL 确实意味着“未知”)。这会将您的声明更改为:

DECLARE @l_date datetime, --I don't set the value as it'll already be NULL
        @l_date1 datetime = GETDATE();

IF @l_date IS NOT NULL 
    SELECT 'Yes' AS [@l_date],
           @l_date AS D;
ELSE
    SELECT 'No' AS [@l_date],
           @l_date AS D;

IF @l_date1 IS NOT NULL 
    SELECT 'Yes' AS [@l_date1],
           @l_date1 AS D;
ELSE
    SELECT 'No' AS [@l_date1],
           @l_date1 AS D;

(请注意,这仍然会分别返回 'No''Yes'。)

【讨论】:

    【解决方案2】:

    documented default value 用于指定空字符串时的时间类型。考虑:

    DECLARE
         @datetime datetime = ''
        ,@smalldatetime smalldatetime = ''
        ,@datetime2 datetime2 = ''
        ,@date date = ''
        ,@time time = ''
        ,@datetimeoffset datetimeoffset = ''
    SELECT
         @datetime AS datetime
        ,@smalldatetime AS smalldatetime
        ,@datetime2 AS datetime2
        ,@date AS date
        ,@time AS time
        ,@datetimeoffset AS datetimeoffset;
    

    结果:

    +-------------------------+---------------------+-----------------------------+------------+------------------+------------------------------------+
    |        datetime         |    smalldatetime    |          datetime2          |    date    |       time       |           datetimeoffset           |
    +-------------------------+---------------------+-----------------------------+------------+------------------+------------------------------------+
    | 1900-01-01 00:00:00.000 | 1900-01-01 00:00:00 | 1900-01-01 00:00:00.0000000 | 1900-01-01 | 00:00:00.0000000 | 1900-01-01 00:00:00.0000000 +00:00 |
    +-------------------------+---------------------+-----------------------------+------------+------------------+------------------------------------+
    

    虽然有时使用零而不是空字符串来表示默认值,但对于较新的 datetime2datetimedatetimeoffset 类型,这是不允许的。

    【讨论】:

      【解决方案3】:

      你可以试试这个

      
      declare @l_date datetime=0 ,@l_date1 datetime = getdate()
      
      if @l_date IS NOT NULL
         select 'Yes' as '@l_date',@l_date D
      else
         select 'No' as '@l_date',@l_date D
      
      if @l_date1 IS NOT NULL
          select 'Yes' as '@l_date1',@l_date1 D
      else
          select 'No' as '@l_date1',@l_date1 D
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-02
        • 1970-01-01
        • 2021-12-07
        • 2021-10-21
        • 2019-08-05
        • 1970-01-01
        • 1970-01-01
        • 2021-09-29
        相关资源
        最近更新 更多