我想编辑我的代码,以便其中一些代码可以在昨天的数据上运行,其中一些代码将在今天的数据上运行(使用transaction
或任何其他日期函数。)
我的代码是:
getdate()
我希望(CAST(vw_public_task.complete_date AS TIME) BETWEEN '08:00' and '23:59'
or
CAST(vw_public_task.complete_date AS TIME) BETWEEN '00:00' and '08:00')
将在昨天的数据上运行,CAST(vw_public_task.complete_date AS TIME) BETWEEN '08:00' and '23:59'
将在今天的数据上运行。
我尝试使用CAST(vw_public_task.complete_date AS TIME) BETWEEN '00:00' and '08:00'
和其他日期功能对其进行编辑但没有成功。
谢谢!
答案 0 :(得分:0)
您可以在昨天的08:00获取,而不是将您的列投射到时间(从而放弃测试它的日期部分的选项,或者使用您在此列中可能包含的任何索引)。今天08:00使用cast
上的双dateadd
和getdate
:
今天08:00:
DATEADD(HOUR, 8, CAST(CAST(GETDATE() As date) As datetime))
这会让你昨天的08:00:
DATEADD(HOUR, -16, CAST(CAST(GETDATE() As date) As datetime))
所以你的where子句可以是这样的:
WHERE vw_public_task.complete_date <=
DATEADD(HOUR, 8, CAST(CAST(GETDATE() As date) As datetime))
AND vw_public_task.complete_date >=
DATEADD(HOUR, -16, CAST(CAST(GETDATE() As date) As datetime))
答案 1 :(得分:0)
创建两个变量。
const mongoose = require('mongoose'),
User = mongoose.model('User');
// create some users
var user1 = new User({name: 'modulus admin', age: 42, roles: ['admin', 'moderator', 'user']});
var user2 = new User({name: 'modulus user', age: 22, roles: ['user']});
user1.save(console.log);
user2.save(console.log);
Where子句如下:
DECLARE @Yesterday DATETIME =
DATEADD(HOUR, 8,
DATEADD(DAY, DAY(GETDATE()) - 2 ,
DATEADD(MONTH, MONTH(GETDATE()) - 1,
DATEADD(YEAR, YEAR(GETDATE()) - 1900, 0)))) -- 2016-07-31 08:00:00.000
DECLARE @Today DATETIME = DATEADD(DAY, 1, @YesterDay) -- 2016-08-01 08:00:00.000
答案 2 :(得分:0)
这样的事情应该有效:
WHERE
vw_public_task.complete_date >= DATEADD(day,DATEDIFF(day,'19000102',GETDATE()),
'1900-01-01T08:00:00') and
vw_public_task.complete_date < DATEADD(day,DATEDIFF(day,'19000101',GETDATE()),
'1900-01-01T08:00:00')
我的DATEADD
/ DATEDIFF
对可能看起来有点时髦,但您可以希望弄清楚他们正在做什么。一旦您意识到DATEDIFF
仅适用于过渡,并返回int
,您就会发现内部DATEDIFF
表达式正在计算如何自1900年1月1日/ 2日以来已过去很多(整整天)。
然后我们将这个天数添加到1900年1月1日的08:00。对于第二个表达式,这意味着我们今天的计算时间是08:00。对于第一个表达式,由于我们首先计算了自 2nd 以来的整天天数,但是将其添加到1月的08:00,这意味着我们昨天正在计算08:00。