我最近遇到过这个:
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然后再回来?
答案 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]