SQL查询错误不会返回星期五的值
|
我有这个sql存储过程,应该查看特定的表并根据日期列返回作业号。除了在周六上午运行(这应该返回日期为星期五的所有作业编号,但不返回任何行)之外,此方法效果很好。有什么建议么?我没有在这里看到一些逻辑问题吗?我该如何追踪?
储存程序
ALTER Procedure [dbo].[JC_GetJobsClosedYesterday]
As
SELECT [JobNumber]
FROM [NCLGS].[dbo].[JobClosedDate]
Where LastInvoiceDate between dbo.ufn_StartOfDay (DATEADD(d, -1, GETDATE())) AND dbo.ufn_StartOfDay (GETDATE())
order by JobNumber desc
和开始一天的功能。
ALTER function [dbo].[ufn_StartOfDay] ( @inDate datetime )
RETURNS DateTime AS
BEGIN
DECLARE @Now datetime
set @Now = @inDate
DECLARE @DayStart datetime
set @DayStart = @Now
set @DayStart = DATEADD (ms, -DATEPART(ms,@Now),@DayStart)
set @DayStart = DATEADD (s, -DATEPART(s,@Now),@DayStart)
set @DayStart = DATEADD (mi, -DATEPART(mi,@Now),@DayStart)
set @DayStart = DATEADD (hh, -DATEPART(hh,@Now),@DayStart)
return @DayStart
END
编辑:我的日期转换没有麻烦(除非它不知道如何处理星期五)。我需要返回无行部分的帮助。
样本数据:
JobNumber LastInvoiceDate DayOfWeek
112117 2011-06-13 00:00:00.000 Monday
112089 2011-06-10 00:00:00.000 Friday
112090 2011-06-10 00:00:00.000 Friday
112068 2011-06-10 00:00:00.000 Friday
112082 2011-06-10 00:00:00.000 Friday
更新:现在我真的很困惑。这种“周五没有数据”的事情已经发生了(上周五再次发生),但是我仍然无法弄清楚。 GETDATE()是否可能没有返回我认为返回的内容?因为当我尝试基于@Thomas的建议进行以下修改时,这两种方法都可以获取数据,但是最后一次基于此代码生成的报告没有数据。
DECLARE @date datetime
--SET @date = \'2011-06-21 13:42:27.257\'
SET @date = \'2011-06-11 03:42:27.257\'
--Original Code
SELECT [JobNumber]
FROM [NCLGS].[dbo].[JobClosedDate]
Where LastInvoiceDate between dbo.ufn_StartOfDay (DATEADD(d, -1, @date)) AND dbo.ufn_StartOfDay (@date)
order by JobNumber desc
--Returns 21 records
--Modified based on @Thomas suggestion
Select [JobNumber]
From [NCLGS].[dbo].[JobClosedDate]
Where LastInvoiceDate >= DateAdd( d, DateDiff( d, 0, @date ) - 1, 0 )
And LastInvoiceDate < DateAdd( d, DateDiff( d, 0, @date ), 0 )
Order By JobNumber Desc
--Returns 21 records
没有找到相关结果
已邀请:
3 个回复
门锑腺潮
函数,但是有更简单的方法可以做到这一点:
这意味着:将nil时间戳增加nil时间戳与给定时间戳之间的整天。 我还建议使用该表达式,而不是已经存在的对该函数的调用,因此您的查询将是:
加成 您需要更清楚地知道问题出在哪里。这是我创建的一个示例查询,它测试从6月9日星期四到6月18日星期六的每个日期。您希望在哪个日期获得值,但没有,反之亦然:
更新资料 在查看您的注释和代码时,我认为问题在于您使用
。
转换为
。即,它包括两个端点。相反,您需要排除最终终点:
这将为您提供上一个日期的所有职位编号。也就是说,如果今天是2011年6月10日,星期五,它将为您提供从
到
的所有LastInvoiceDate值。
庞协腿宛炯
这应该是最快的方法。从而
捅瓶啡
这将强制在周六和周日上午进行更新。