2012-03-02 44 views
2

我试图获取当前日期 - 6天。这很容易。TSQl:选择当前日期 - 6天,并将时间设置为12:01上午

现在我试图获得当前日期 - 6天+ 12:01上午。

因此,如果今天是2012年3月2日上午11:14。

我想2012年2月25日上午12:01

这2个选择会给我当前的日期 - 6,但时间不会恢复到上午12:01

  • 选择getdate() - 6
  • SELECT DATEADD(day,-6,CURRENT_TIMESTAMP);
+0

您选择的解决方案是最糟糕的解决方案 – 2012-03-05 08:50:49

回答

5

使用下面会给你的结果在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

0
SELECT DATEADD(dd, -6, DATEDIFF(dd, 0, GETDATE())) + '12:01' 
+0

6天前你错过了他想要的部分。 – brianmearns 2015-12-03 19:23:25

+0

所以我做到了。答复已更新;谢谢@ sh1ftst0rm – Carl 2015-12-08 09:37:51

6
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实现更快,更灵活。通过保持数据类型的原样,您不必担心cast/convert结果的变幻莫测。

见路易·戴维森为全面解释相关的一个: http://sqlblog.com/blogs/louis_davidson/archive/2011/02/09/some-date-math-fun.aspx

+0

+1比连接丑陋的字符串更清洁。我可能会避免'GETDATE() - 6',尽管为了避免使日期延续,因为这种方法不适用于SQL Server 2008中引入的新日期/时间类型。 – 2012-03-02 17:07:53

+0

将-6应用于偏移量,这已经是一个整数。这实际上突出了这种技术的一个主要缺点:括号太多。 – 2012-03-02 18:49:23

+0

是的,我知道在DATE变量中替换GETDATE()不会破坏这个特定的代码,我只是认为最好的做法是在日期数学中使用显式DATEADD。如果你使用的是静态日期而不是0,那么可能会更清楚发生了什么;我也使用0,但我试图打破这种习惯。 – 2012-03-02 19:05:37

3

少了一个转换是@Phil赫尔默的解决方案:

SELECT DATEADD(DAY, DATEDIFF(DAY, '19000101', GETDATE()), '1899-12-26T12:01:00') 

由于有些人显然不知道这一切“向右”的在DATEADD/DATEDIFF对中指定的元素实际上取自右侧常量。一切“向左”(包括实际元素)都可以用来实现抵消效应。

(以上左/右被假定整个日期时间值被解释与年向左和毫秒到右侧,与“尺寸”指令中的所有中间值)


编辑 - 我还更新了我的答案,将-6包含在右边的值中。可以通过为两个常量选择合适的值来创建各种偏移量。


在表达式中指定的两个日期时间常量之间的关系应该表达出来,至少在用法的注释旁边。在上面,我使用1/1/1900作为基点,并计算当时和现在之间的午夜过渡数(因为DATEDIFF总是有效的)。然后,我在6天前的某个时间点(例如26/12/1899)在早上的00:01将这些天数加上...

+0

这正是我喜欢DADD解决方案的原因(OP:http://www.sqlservercentral.com/articles/Date+Manipulation/69694/),它非常灵活。可能是在“聪明”的某个点之后,日历表具有一些优势,但如果偏移,规则等容易发生变化,则DADD会再次出现。顺便说一句,还应该注意的是,无论使用整理/本地化,他在这里使用的日期文字格式的使用总是被解释为相同的(参见:http://social.msdn.microsoft.com/Forums/en/transactsql/螺纹/ d0f28d86-fea1-40f6-b982-65f6849b9eca) – 2012-03-03 03:36:56

相关问题