简体   繁体   English

用于选择从昨天的特定日期/时间到当天的特定日期/时间的范围的 SQL 查询

[英]SQL query to select range from specific date/time yesterday to specific date/time current day

SELECT * 
FROM services 
WHERE service_date BETWEEN (dateadd(DD, -1, getdate())) AND (dateadd(DD, 1, getdate())) **---Gives us a last one day data.**

but what we really need is data from 07:00 AM yesterday to 06:59 AM current day, so I tried the following:但我们真正需要的是从昨天07:00 AM到当天07:00 AM 06:59 AM数据,所以我尝试了以下操作:

SELECT * 
FROM services 
WHERE service_date BETWEEN (dateadd(DD, -1,((DatePart(hh, getdate())) >= 7 ))) **-- Expecting to pull from yesterday 07:00** 
                   AND (dateadd(DD, -1,((DatePart(hh, getdate())) <= 6 ))) **-- to current day till 06:59**

but the system didn't like my SQL skills ...PLEASE HELP...!但是系统不喜欢我的 SQL 技能...请帮助...!

These will get you the dates you are looking for...这些将为您提供您正在寻找的日期......

Select DATEADD(HOUR,-17, (DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)))


Select DATEADD(HOUR,7, (DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)))

I'm not sure if this is the most effective way but it works.我不确定这是否是最有效的方法,但它有效。

Assuming you are on SQL Server:假设您在 SQL Server 上:

Select *
From MyTable
Where MyDateColumn Between DATEADD(hh, 7, Cast(Cast(DATEADD(d, -1, CURRENT_TIMESTAMP) As Date) As DateTime)) 
                       And DATEADD(hh, 6, Cast(Cast(CURRENT_TIMESTAMP As Date) As DateTime))

UPDATE: I agree with Andy's solution.更新:我同意安迪的解决方案。 Similar approach but his solution is much more elegant and efficient.类似的方法,但他的解决方案更加优雅和高效。

Try something like that:尝试这样的事情:

SELECT * 
FROM services 
WHERE service_date
      BETWEEN Convert(DateTime, Convert(nchar(4), DatePart(YYYY, GETDATE())) + '-' 
+ Convert(nchar(2), DATEPART(MM, GETDATE())) + '-' 
+ Convert(nchar(2), DATEPART(DD, Getdate())-1) + ' 7:00:00')
      AND Convert(DateTime, Convert(nchar(4), DatePart(YYYY, GETDATE())) + '-' 
+ Convert(nchar(2), DATEPART(MM, GETDATE())) + '-' 
+ Convert(nchar(2), DATEPART(DD, Getdate())) + ' 6:59:00')

The idea is to take the year, month and day from today (or yesterday), and form a new date by concatenate them.这个想法是从今天(或昨天)中取出年、月和日,并通过将它们连接起来形成一个新的日期。

Beware of the culture settings for date format and do some testing before put this code into production.注意日期格式的文化设置,并在将此代码投入生产之前进行一些测试。

You could also use mi (minutes) with DateAdd .您还可以将mi (分钟)与DateAdd Adding 419 minutes to midnight to get 06:59 and a nice round 420 minutes to yesterday midnight for 07:00将 419 分钟添加到午夜以获得06:59和一个不错的回合 420 分钟到昨天午夜07:00

Edit : Changed the DateDiff function to work with Sybase.编辑:更改了 DateDiff 函数以与 Sybase 一起使用。

SELECT *
FROM services
WHERE service_date BETWEEN DATEADD(mi, 420, DATEADD(d, -1, DATEDIFF(d, DATE('1900-01-01'), GETDATE()))) 
                       AND DATEADD(mi, 419, DATEADD(d, -0, DATEDIFF(d, DATE('1900-01-01'), GETDATE())));

Edit : Removing DateDiff function编辑:删除 DateDiff 函数

SELECT *
FROM services
WHERE service_date BETWEEN DATEADD(mi, 420, DATEADD(d, - 1, Convert(VARCHAR(10), GETDATE(), 111)))
                       AND DATEADD(mi, 419, DATEADD(d, - 0, Convert(VARCHAR(10), GETDATE(), 111)));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM