从给定的DATETIME创建“BETWEEN / AND”能力的DATETIME

时间:2012-01-04 13:36:10

标签: sql-server tsql datetime

我想创建两个DATETIME变量,当在SQL Server 2008上的存储过程中只给出一个BETWEEN AND时,我可以用它来检查DATETIME

因此,当我获得2012/12/31 15:32:12作为输入时,我想生成两个新变量,即@from = 2012/12/31 00:00:00@to = 2012/12/31 23:59:59

这两个变量用于检查记录是否位于它们之间 - 即与输入日期在同一天。

我愚弄了使用CAST和CONVERT,但我真的不知道如何以我想要的方式操纵日期。

我应该这样做吗?还是有我不知道的功能?

4 个答案:

答案 0 :(得分:4)

现在它与版本无关

declare @from datetime, @to datetime

SET @from = convert(varchar, convert(datetime, '2012/12/31 15:32:12', 111), 112)
SET @to = DATEADD(day, 1, @from)

select * from yourtable where test date >= @from AND date < @to

答案 1 :(得分:2)

你可以;

declare @input datetime = '2012/12/31 15:32:12'
declare @from  datetime = dateadd(day, 0, datediff(day, 0, @input))
declare @to    datetime = dateadd(second, -1, dateadd(day, 1, @from))

>>>
2012-12-31 00:00:00.000 2012-12-31 23:59:59.000

答案 2 :(得分:1)

小心@to的准确性。 23:59:59.001是一个有效的日期,但如果你减去一整秒,它就不会显示在你的范围内。

更常见的是设置@from然后使用&lt; @from + 1而不是BETWEEN。 (加号在SQL中添加了整天)。

答案 3 :(得分:0)

首先使用适当的日期格式(在本例中为111)将输入日期转换为varchar,对于到目前为止,请附加午夜时间

然后将varchar转换回日期时间。

示例:

SELECT @from = CAST(CONVERT(VARCHAR(10), GETDATE(), 111) AS DATETIME)
      ,@to = CAST(CONVERT(VARCHAR(10), GETDATE(), 111)+' 23:59:59:997' AS DATETIME)

这是一个有用的日期时间格式图表,并附有简要说明。

http://www.sql-server-helper.com/tips/date-formats.aspx