Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQl:选择当前日期-6天,并将时间设置为12:01 AM_Sql_Sql Server_Sql Server 2008_Sql Server 2005_Tsql - Fatal编程技术网

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

TSQl:选择当前日期-6天,并将时间设置为12:01 AM,sql,sql-server,sql-server-2008,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2008,Sql Server 2005,Tsql,我正在尝试获取当前日期-6天。这很容易 现在我正在尝试获取当前日期-6天+12:01上午 如果今天是2012年3月2日上午11:14 我想要2012年2月25日凌晨12:01 这两个选项将为我提供当前日期-6,但不会将时间重置为12:01 AM 选择getdate()-6 选择DATEADD(第-6天,当前时间戳) 使用以下命令将以datetime格式显示结果: SELECT CAST(Convert(varchar(10), DateAdd(d, -6, getdate()), 101)

我正在尝试获取当前日期-6天。这很容易

现在我正在尝试获取当前日期-6天+12:01上午

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

我想要2012年2月25日凌晨12:01

这两个选项将为我提供当前日期-6,但不会将时间重置为12:01 AM

  • 选择getdate()-6
  • 选择DATEADD(第-6天,当前时间戳)
使用以下命令将以
datetime
格式显示结果:

SELECT CAST(Convert(varchar(10), DateAdd(d, -6, getdate()), 101) 
        + ' 12:01 AM' as datetime)
select Convert(varchar(10), DateAdd(d, -6, getdate()), 110) + ' 12:01 AM'
结果:
2012-02-25 00:01:00.000

一旦有了所需的日期时间,就可以将其转换为多种不同的格式

或者您可以执行以下
varchar
格式的操作:

SELECT CAST(Convert(varchar(10), DateAdd(d, -6, getdate()), 101) 
        + ' 12:01 AM' as datetime)
select Convert(varchar(10), DateAdd(d, -6, getdate()), 110) + ' 12:01 AM'
这导致了
02-25-2012 12:01 AM

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

SELECT DATEADD(minute, 1, DATEADD(DAY, DATEDIFF(DAY, '19000101', GETDATE()) - 6, '19000101'))
我想您会发现这个选项比varchar实现更快、更灵活。通过保持数据类型不变,您不必担心强制转换/转换结果的不确定性

请参见路易斯·戴维森的完整解释:

少了一个转换@Phil Helmer的解决方案:

SELECT DATEADD(DAY, DATEDIFF(DAY, '19000101', GETDATE()), '1899-12-26T12:01:00')
因为有些人显然不知道,在
DATEADD
/
DATEDIFF
对中指定的元素的“右边”的所有内容实际上都是从右边常量中获取的。“向左”(包括实际元素)的所有内容都可以用于实现偏移效果

(上面的左/右假设整个datetime值的解释方式为:左边是年,右边是毫秒,所有中间值都是“大小”顺序)


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



表达式中指定的两个datetime常量之间的关系应该表示出来,至少在用法旁边的注释中是这样。在上面,我使用1/1/1900作为基点,并计算从那时到现在的午夜转换次数(因为
DATEDIFF
始终有效)。然后,我在6天前(例如,1899年12月26日)的凌晨00:01将天数添加到时间点上…

+1比连接丑陋的字符串要干净得多。我可能会避免使用
GETDATE()-6
,但这只是为了避免长期使用日期速记,因为这种方法不适用于SQL Server 2008中引入的新日期/时间类型。将-6应用于偏移量,偏移量已经是一个整数。这实际上突出了这种技术的一个主要缺点:括号太多。是的,我知道用日期变量替换GETDATE()不会破坏这段特定的代码,我只是认为在一般情况下,使用显式DATEADD进行日期数学比较好。如果使用静态日期而不是0,可能会更清楚发生了什么;我也使用0,但我正在努力改掉这个习惯。我现在明白了。是的,我辩论了是否要在代码中添加第三个日期,我的处境是一样的:0对19000101。@Phillhelmer-我已经添加了我对你答案的厚颜无耻的看法。您可以利用这两个常量之间的差异,并通过单个
DATEADD
/
DATEDIFF
对实现很多。这正是我喜欢DADD解决方案(OP:)的原因,它非常灵活。这可能是因为经过一定程度的“聪明”之后,日历表有一些优势,但是如果偏移量、规则等容易改变,DADD会再次出现。顺便说一句,还应该注意的是,他在这里使用的日期文字格式的使用总是被解释为相同的,不管排序/本地化(参见:)您选择的解决方案是最糟糕的手术您错过了他6天前想要的部分。