如何在现有代码上使用getdate语法?

时间:2016-08-01 07:20:21

标签: sql sql-server

我想编辑我的代码,以便其中一些代码可以在昨天的数据上运行,其中一些代码将在今天的数据上运行(使用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'和其他日期功能对其进行编辑但没有成功。

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以在昨天的08:00获取,而不是将您的列投射到时间(从而放弃测试它的日期部分的选项,或者使用您在此列中可能包含的任何索引)。今天08:00使用cast上的双dateaddgetdate

今天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。