4

我最近遇到了这个:

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_Date,End_Date显然GETDATE()是所有datetime类型。为什么他会转换为 varchar 然后又返回?

4

3 回答 3

4

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

另一个是

select cast(floor(cast(getdate() as float)) as datetime)
于 2012-04-18T03:33:11.697 回答
4

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

于 2012-04-18T03:33:37.487 回答
2

我真的不喜欢缓慢的日期转换为 varchar 并返回。

我推荐另外两种编写代码的方法:

sql 服务器 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]
于 2012-04-18T07:49:39.470 回答