我有这个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
答案 0 :(得分:5)
您应使用返回前一天开头的表达式,而不是DATEADD(d, -1, GETDATE())
。你可以使用你的dbo.ufn_StartOfDay()
函数,但有更简单的方法来做同样的事情:
Select @DayStart = DateAdd( d, DateDiff( d, 0, @inDate ), 0 )
表示:将nil时间戳增加nil时间戳与给定时间戳之间的整数天
。我还建议使用该表达式而不是已经存在的函数调用,因此您的查询将是:
Select [JobNumber]
From [NCLGS].[dbo].[JobClosedDate]
Where LastInvoiceDate Between DateAdd( d, DateDiff( d, 0, GetDate() ) - 1, 0 )
And DateAdd( d, DateDiff( d, 0, GetDate() ), 0 )
Order By JobNumber Desc
<强>加成强>
您需要更清楚问题的确切位置。这是我创建的一个示例查询,它测试从6月9日星期四到6月18日星期六的每个日期。您希望在哪个日期获得值但未反映或反之亦然:
With SampleData As
(
Select 112117 As JobNumber, '2011-06-13 00:00:00.000' As LastInvoiceDate, 'Monday' As DayOfWeek
Union All Select 112089, '2011-06-10 00:00:00.000', 'Friday'
Union All Select 112090, '2011-06-10 00:00:00.000', 'Friday'
Union All Select 112068, '2011-06-10 00:00:00.000', 'Friday'
Union All Select 112082, '2011-06-10 00:00:00.000', 'Friday'
)
, TestDates As
(
Select Cast('20110609' As datetime) As Date
Union All
Select DateAdd(d,1,Date)
From TestDates
Where Date <= '20110617'
)
Select TD.Date, DateName(dw,TD.Date), Count(SD.JobNumber)
From TestDates As TD
Left Join SampleData As SD
On SD.LastInvoiceDate Between DateAdd( d, DateDiff( d, 0, TD.Date ) - 1, 0 )
And DateAdd( d, DateDiff( d, 0, TD.Date ), 0 )
Group By TD.Date
<强>更新强>
在查看您的评论和代码时,我认为问题在于您使用Between
。 Col Between DateA And DateB
转换为Col >= DateA And Col <= DateB
。即,它包括两个端点。相反,您需要排除最终结束点:
Select [JobNumber]
From [NCLGS].[dbo].[JobClosedDate]
Where LastInvoiceDate >= DateAdd( d, DateDiff( d, 0, GetDate() ) - 1, 0 )
And LastInvoiceDate < DateAdd( d, DateDiff( d, 0, GetDate() ), 0 )
Order By JobNumber Desc
这将为您提供上一日期的所有工作号码。即,如果今天是2011年6月10日星期五,它将为您提供从2011-06-09 midnight
到2011-06-09 23:59:59
的所有LastInvoiceDate值。
答案 1 :(得分:0)
剥去时间部分使用:
SELECT CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS float)) AS DATETIME)
这应该是最快的方法。因此
SELECT [JobNumber]
FROM [NCLGS].[dbo].[JobClosedDate]
WHERE LastInvoiceDate between
CAST((FLOOR(CAST(GETDATE() float))-1.0) AS DATETIME) AND
CAST(FLOOR(CAST(GETDATE() AS float)) AS DATETIME)
ORDER BY JobNumber DESC
答案 2 :(得分:0)
更新作业关闭表的过程在周一,周二,周三,周四和周围运行。星期五早上。它不会在星期六运行,因此记录不会在星期一之前插入,此时它们将不会被我的存储过程检索。我会安排更新工作也在星期六运行。
我在select语句之前添加了以下内容:
if datepart(dw, GETDATE()) = 7 OR datepart(dw, GETDATE()) = 1
BEGIN
Exec dbo.NCL_MaintainJobClosedDateTable
--Select 'True'
END
这将迫使周六和周日早上更新。