【发布时间】:2011-06-14 17:44:40
【问题描述】:
我有这个 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
【问题讨论】:
-
为什么不能使用 CONVERT(varchar,getdate(),101)
-
@THEn - 没有理由。这是我继承的代码。
-
您是否有至少 1 行未显示的示例数据......
-
@MAW74656,抛开性能不谈,我看到的唯一逻辑问题是
between包含两个端点。根据您的样本数据,什么不起作用? (即查询何时运行,返回了什么,应该返回什么?) -
@MAW74656 - 是不是拉下数据上周五或上周五或上周六我>?前者意味着该例程在周六运行以获取周五的数据。后两者意味着可能在例程本身而不是查询的运行中出现了问题。
标签: sql tsql sql-server-2000