TSQl:选择当前日期-6天,并将时间设置为12:01 AM



我正在尝试获取当前日期-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'

最新更新