首页 > 解决方案 > 当列包含空值时,日期时间列的行为如何?

问题描述

我遇到了一些问题,当我将一个空值传递给日期时间变量时,它存储为默认日期(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

我希望两者都应该返回“是”。不幸的是,第一个条件返回“否”,第二个条件返回“是”。任何人都可以解释它是如何工作的功能。

标签: sqlsql-servertsqlsql-server-2008-r2

解决方案


当指定空字符串时,记录的默认值用于时间类型。考虑:

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 |
+-------------------------+---------------------+-----------------------------+------------+------------------+------------------------------------+

datetime2尽管有时使用零而不是空字符串来表示默认值,但对于较新的 、datetimedatetimeoffset类型,这是不允许的。


推荐阅读