在SQL Server 2008中截断日期时间值(删除小时分钟和秒)的最佳方法是什么?
例如:
declare @SomeDate datetime = '2009-05-28 16:30:22'
select trunc_date(@SomeDate)
-----------------------
2009-05-28 00:00:00.000
Run Code Online (Sandbox Code Playgroud) 我们所有使用关系数据库的人都已经学习(或正在学习)SQL是不同的.引出期望的结果,并且有效地进行,涉及一个繁琐的过程,其部分特征是学习不熟悉的范例,并发现我们最熟悉的一些编程模式在这里不起作用.您见过(或自己承诺)的常见反模式有哪些?
这是我使用的:
SELECT CAST(FLOOR(CAST(getdate() as FLOAT)) as DATETIME)
Run Code Online (Sandbox Code Playgroud)
我想可能会有更好更优雅的方式.
要求:
datetime类型,而不是字符串.在MS SQL 2000和2005中,给定日期时间,例如'2008-09-25 12:34:56',获得仅包含'2008-09-25'的日期时间的最有效方法是什么?
这里重复一遍.
我正在使用MS SQL 2005,我想检查两个日期是否相等,但忽略了时间部分.
我知道我可以使用DATEDIFF,但我担心它可能会很慢 - 这个SP在DB中被大量使用!
有什么建议?
编辑:大卫安德烈斯的评论:
"比较"不仅包括"平等"让我意识到我没有让我的问题足够清楚 - 我实际上只是在检查是否平等,就是这样.
我在SQL中有一个DateTime类型的变量.只需要将Date作为其中的一部分.
请帮忙?
更多的警告而不是问题:
我们今天早上解决了一个非常令人费解的错误.我们有各种报告,允许用户输入他们想要运行的日期范围.假设是,如果您要求从2010年8月1日到2010年8月10日的报告,您打算包括 8/10/2010,那么报告的结束日期不是8/10,那是之后的事情.
它不能是8/11/2010,因为这些报告中的一些汇总了一天中发生的所有事情,在那一天将它们分组到午夜,因此每日汇总将包括额外的一天 - 而不是我们想要的.
为了避免错过任何非常接近当天结束的项目的可能性,我们将结束日期计算为比明天更少的"一个标记":
public static DateTime EndOfDay(DateTime day)
{
return day.Date.AddDays(1).AddTicks(-1);
}
Run Code Online (Sandbox Code Playgroud)
在内部,这最终会像8/10/2010 12:59:59.9999PM
好吧,当你将这个DateTime传递给SQL Server中的DATETIME参数时,它会将值UP舍入到8/11/2010 00:00:00!因为我们的查询使用
DateField BETWEEN @FromDate AND @ToDate
Run Code Online (Sandbox Code Playgroud)
代替
DateField >= @FromDate AND DateField < @ToDate
Run Code Online (Sandbox Code Playgroud)
我们看到2010年8月1日至2010年8月10日的报告中包含了2010年11月8日的报告.
我们发现真正问题的唯一方法是通过字符串往返日期.DateTime.ToString()也是如此,所以我们最终得到了SQL Server很满意的8/1/2010 12:59:59 PM.
所以现在我们的'结束日'方法看起来像这样:
public static DateTime EndOfDay(DateTime day)
{
// Cant' subtract anything smaller (like a tick) because SQL Server rounds UP! Nice, eh?
return day.Date.AddDays(1).AddSeconds(-1);
}
Run Code Online (Sandbox Code Playgroud)
抱歉不是问题 - 只是觉得有人可能觉得它很有用.