我有一个类似的查询:
SELECT ..
FROM ...
WHERE ...
AND ISNULL(ICA.actual_appearance_date, ICA.scheduled_appearance_date)
BETWEEN LO.order_start_date
AND ISNULL(LO.actual_expiry_date, LO.expected_expiry_date)
是否有一种简洁的方法只检查actual_appearance_date是否在开始日期和结束日期之间,但不包括时间?
所以:
外观日期是2011年10月3日@ 14h00 ...我们检查的日期是03 / Oct / 2011 @ 15h00和07 / Oct / 2011 @ 10h00。
目前,由于时间因素,这不会产生结果。我只需要在日期部分之间做一个......所以,在2011年10月3日@ 0h00和08/10月/ 2011 @ 0:00之间。
有没有一种巧妙的方法可以做到这一点?
编辑:
我们正在为2008年的机器开发,但我们正在开发2005年的机器。很长的故事,但我不能使用漂亮而整洁的DATE修复。
我正在尝试使用DATEADD方法,但我发现了一个问题。
这不会返回我期望的结果:
DECLARE @Table TABLE
(
StartDate DATETIME,
EndDate DATETIME
)
INSERT INTO @Table VALUES ('02-Jan-2011 13:00:00', '07-Jan-2011 15:30:00')
SELECT * FROM @Table
DECLARE @Date DATETIME
SET @Date = '07-Jan-2011 16:00:00'
SELECT
CASE WHEN
@Date BETWEEN DATEADD(dd,DATEDIFF(dd,0,StartDate),0) AND DATEADD(dd, DATEDIFF(dd,0,EndDate),0)-- must cover the appearance date or still open
THEN 1
ELSE 0
END AS Result
FROM @Table
我必须在BETWEEN日期添加+1以包含最后日期吗? 'BETWEEN'似乎不包括最后一次约会..
答案 0 :(得分:2)
你有SQL Server 2008所以只是转换为日期
SELECT ..
FROM ...
WHERE ... AND
CAST(ISNULL(ICA.actual_appearance_date, ICA.scheduled_appearance_date) AS date)
BETWEEN
CAST(LO.order_start_date AS date)
AND
CAST(ISNULL(LO.actual_expiry_date, LO.expected_expiry_date) AS date)
对于SQL Server 2005及更早版本,请使用DATEDIFF / DATEADD技巧:Best approach to remove time part of datetime in SQL Server
不要使用varchar或float转换
编辑:,对于SQL Server 2005
您需要将DATEADD / DATEDIFF应用于所有值
...
SELECT
CASE WHEN
DATEADD(dd,DATEDIFF(dd,0,@Date),0)
BETWEEN DATEADD(dd,DATEDIFF(dd,0,StartDate),0)
AND DATEADD(dd, DATEDIFF(dd,0,EndDate),0)
THEN 1
ELSE 0
END AS Result
FROM @Table
或者
WHERE ... AND
DATEADD(dd,DATEDIFF(dd,0,ISNULL(ICA.actual_appearance_date, ICA.scheduled_appearance_date),0)
BETWEEN
DATEADD(dd,DATEDIFF(dd,0,LO.order_start_date),0)
AND
DATEADD(dd,DATEDIFF(dd,0,ISNULL(LO.actual_expiry_date, LO.expected_expiry_date),0)
答案 1 :(得分:-2)
您可以使用转换过程然后比较:
Convert(Datetime,Convert(Varchar,OrderDate,106),110)