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

时间:2012-04-18 03:25:59

标签: tsql casting

我最近遇到过这个:

SELECT
    'Y',
    ltrim(rtrim(upper(Newly_Eligible)))
FROM Table
WHERE 
    Id = 1
AND
    (Convert(datetime, Convert(varchar, GETDATE(),103),103)  
    BETWEEN
        Convert(datetime,Convert(varchar, [Start_Date],103),103)
    AND
        Convert(datetime, Convert(varchar, [End_Date] ,103),103))

Start_DateEnd_Date,显然GETDATE()都是datetime类型。为什么他会转向varchar然后再回来?

3 个答案:

答案 0 :(得分:4)

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

另一个是

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

答案 1 :(得分:4)

这会截断日期时间之外的任何多余时间值,只留下日期值。 (关键是转换代码“103”。)

答案 2 :(得分:2)

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

我超越了另外两种编写代码的方法:

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已经被剥离了时间部分,它将永远不会比同一天的end_date大

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]