为什么TSQL会转换日期时间->;varchar->;约会时间?

为什么TSQL会转换日期时间->;varchar->;约会时间?,tsql,casting,Tsql,Casting,我最近遇到了这样一个问题: 选择 “Y”, ltrim(rtrim(上(新合格))) 从桌子上 哪里 Id=1 及 (Convert(datetime,Convert(varchar,GETDATE(),103),103) 之间 转换(datetime,Convert(varchar,[开始日期],103),103) 及 转换(datetime,Convert(varchar,[End_Date],103),103)) Start\u Date、End\u Date和GETDATE()显然都是

我最近遇到了这样一个问题:

选择
“Y”,
ltrim(rtrim(上(新合格)))
从桌子上
哪里
Id=1
及
(Convert(datetime,Convert(varchar,GETDATE(),103),103)
之间
转换(datetime,Convert(varchar,[开始日期],103),103)
及
转换(datetime,Convert(varchar,[End_Date],103),103))

Start\u Date
End\u Date
GETDATE()
显然都是
datetime
类型。为什么他要对varchar进行强制转换,然后再进行转换?

这样做是为了删除时间,因此您只能比较相同格式的日期。这有几种方法,以上就是其中之一

另一个是

select cast(floor(cast(getdate() as float)) as datetime)

这将截断datetime中多余的时间值,只保留日期值。(关键是转换代码“103”。

我真的不喜欢那种转换为varchar和varchar的缓慢的日期转换

我尝试了两种编写代码的其他方法:

sql server 2005:

SELECT
    'Y'
    ltrim(rtrim(upper(Newly_Eligible)))
FROM table
WHERE 
    Id = 1
AND
    dateadd(day, datediff(day, 0,  getdate()), 0)
    BETWEEN
        dateadd(day, datediff(day, 0,  [Start_Date], 0)
    AND
    [End_Date] -- *
*由于时间部分的比较getdate已被剥离,因此它永远不会大于同一天的结束日期

sql server 2008:

SELECT
    'Y',
    ltrim(rtrim(upper(Newly_Eligible)))
FROM table
WHERE 
    Id = 1
AND
    cast(GETDATE() as date)
BETWEEN
    cast([Start_Date] as date)
AND
    [End_Date]

谢谢你的回复。RBarryYoung几秒钟前就回来了:)