我正在尝试获取当前日期-6天。这很容易。
现在我正在尝试获取当前日期-6天+12:01 am。
因此,如果今天是2012年3月3日上午11:14。
我想得到2-25-2012 12:01 AM
这两个选择将给我当前日期-6,但不会将时间重置为12:01 AM
- 选择getdate()-6
- 选择DATEADD(第6天,CURRENT_TIMESTAMP)
SELECT DATEADD(minute, 1, DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) - 6, 0))
相当于
SELECT DATEADD(minute, 1, DATEADD(DAY, DATEDIFF(DAY, '19000101', GETDATE()) - 6, '19000101'))
我想您会发现这个选项比varchar实现更快、更灵活。通过保持数据类型不变,您不必担心强制转换/转换结果的变幻莫测。
请参阅Louis Davidson的完整解释:http://sqlblog.com/blogs/louis_davidson/archive/2011/02/09/some-date-math-fun.aspx
使用以下内容将以datetime
格式给出结果:
SELECT CAST(Convert(varchar(10), DateAdd(d, -6, getdate()), 101)
+ ' 12:01 AM' as datetime)
结果:2012-02-25 00:01:00.000
一旦你有了想要的日期时间,你就可以把它转换成许多不同的格式。
或者,您可以执行以下varchar
格式的操作:
select Convert(varchar(10), DateAdd(d, -6, getdate()), 110) + ' 12:01 AM'
导致02-25-2012 12:01 AM
比@Phil Helmer的解决方案少了一个转换:
SELECT DATEADD(DAY, DATEDIFF(DAY, '19000101', GETDATE()), '1899-12-26T12:01:00')
因为有些人显然不知道DATEADD
/DATEDIFF
对中指定的元素"右边"的所有内容实际上都取自右边的常数。所有"左边"的东西(包括实际元素)都可以用来实现抵消效果。
(上面的左/右假设整个日期时间值向左以年为单位,向右以毫秒为单位进行解释,所有中间值按"大小"顺序排列)
已编辑-我还更新了我的答案,将-6
包含在右侧的值中。通过为这两个常量选择合适的值,可以创建各种偏移。
表达式中指定的两个日期时间常数之间的关系应该表达出来,至少应该在用法旁边的注释中表达出来。在上面的文章中,我使用1/1/1900作为基点,并计算从那时到现在的午夜转换次数(因为DATEDIFF
总是有效的)。然后,我将这个天数添加到6天前(例如,1899年12月26日)的时间点上,正好是凌晨00:01。。。
SELECT DATEADD(dd, -6, DATEDIFF(dd, 0, GETDATE())) + '12:01'