Reputation: 119
I have encountered some problem , when i passed an empty value to date time variable it stores as default date(1900-01-01 00:00:00.000)
i wrote a conditional statement that
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
I expected both should be return "Yes". Unfortunately 1st condition returns "No" and 2nd condition returns "Yes". Can anyone explain the functionality how does it works.
Upvotes: 0
Views: 108
Reputation: 46203
The documented default value is used for temporal types when an empty string is specified. Consider:
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;
Result:
+-------------------------+---------------------+-----------------------------+------------+------------------+------------------------------------+
| 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 |
+-------------------------+---------------------+-----------------------------+------------+------------------+------------------------------------+
Although zero is sometimes used instead of empty string to denote a default value, this is not allowed for the newer datetime2
, date
, time
, and datetimeoffset
types.
Upvotes: 2
Reputation: 82
You can try this
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
Upvotes: 0
Reputation: 95561
There is no ''
value for a datetime
. ''
will be implicitly cast the to the value 19000101
, as you've seen. if you have an unknown date, use NULL
(NULL
does mean "unknown" after all). This changes your statement to:
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;
(Note this still returns 'No'
and 'Yes'
respectively.)
Upvotes: 2