sql - 当列包含空值时,日期时间列的行为如何?
问题描述
我遇到了一些问题,当我将一个空值传递给日期时间变量时,它存储为默认日期(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
我希望两者都应该返回“是”。不幸的是,第一个条件返回“否”,第二个条件返回“是”。任何人都可以解释它是如何工作的功能。
解决方案
当指定空字符串时,记录的默认值用于时间类型。考虑:
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
尽管有时使用零而不是空字符串来表示默认值,但对于较新的 、date
、time
和datetimeoffset
类型,这是不允许的。
推荐阅读
- javascript - 有没有办法在 ReactJS 中的 chrome 上自动播放音频而无需用户交互?
- javascript - 试图将变量传递给文本组件
- html - 根据值以特定颜色回显数据库值
- racket - 如何在 Racket 中使用 lambda 定义时区和列表
- makefile - Makefile 始终有“@”符号,这是正确的还是应该是别的东西?
- python - 带有 Manim 的长文本
- javascript - 如何在单击下拉 btn 链接下一页时保持显示下拉容器(列出项目)
- angular - Twitch OAuth 与 Nebular (Angular)
- sql - 关于SQL查询和变换row和col的问题
- r - R将值映射到新列