Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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
Sql server 在SQL server中输入日期_Sql Server_Tsql - Fatal编程技术网

Sql server 在SQL server中输入日期

Sql server 在SQL server中输入日期,sql-server,tsql,Sql Server,Tsql,在SQL Server中,如何将日期时间“限定”为秒/分钟/小时/天/年 假设我的日期是2008-09-17 12:56:53.430,那么地板的输出应该是: 年份:2008-01-01 00:00:00.000 月份:2008-09-01 00:00:00.000 日期:2008-09-17 00:00:00.000 时间:2008-09-17 12:00:00.000 分钟:2008-09-1712:56:00.000 第二:2008-09-1712:56:53.000 关键是使用和以及适

在SQL Server中,如何将日期时间“限定”为秒/分钟/小时/天/年

假设我的日期是2008-09-17 12:56:53.430,那么地板的输出应该是:

  • 年份:2008-01-01 00:00:00.000
  • 月份:2008-09-01 00:00:00.000
  • 日期:2008-09-17 00:00:00.000
  • 时间:2008-09-17 12:00:00.000
  • 分钟:2008-09-1712:56:00.000
  • 第二:2008-09-1712:56:53.000
关键是使用和以及适当的SQL timespan枚举

declare @datetime datetime;
set @datetime = getdate();
select @datetime;
select dateadd(year,datediff(year,0,@datetime),0);
select dateadd(month,datediff(month,0,@datetime),0);
select dateadd(day,datediff(day,0,@datetime),0);
select dateadd(hour,datediff(hour,0,@datetime),0);
select dateadd(minute,datediff(minute,0,@datetime),0);
select dateadd(second,datediff(second,'2000-01-01',@datetime),'2000-01-01');
select dateadd(week,datediff(week,0,@datetime),-1); --Beginning of week is Sunday
select dateadd(week,datediff(week,0,@datetime),0); --Beginning of week is Monday

请注意,当您在第二个地板上铺设地板时,如果使用0,通常会出现算术溢出。因此,请选择一个已知值,该值保证低于您尝试设置的日期时间。

该函数也可以执行此操作,具体取决于您使用的样式。

可惜它不是Oracle,否则您可以使用trunc()或to_char()


但是我在SQL Server中遇到了类似的问题,并使用了CONVERT()和DateDiff()方法,如SQL Server中引用的

SELECT CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS float)) AS DATETIME)
将日期时间强制转换为浮点数,浮点数将日期表示为整数部分,时间表示为一天过去的分数。切掉小数部分,然后把它放回日期时间,你就有了那天开始时的午夜


这可能比所有DATEADD和DATEDIFF的东西更有效。这当然更容易输入。

因为PostgreSQL也是一个“SQL服务器”,我要提到

date_trunc()
这正好符合你的要求

例如:

select date_trunc('hour',current_timestamp); date_trunc ------------------------ 2009-02-18 07:00:00-08 (1 row) 选择日期(“小时”,当前时间戳); 日期 ------------------------ 2009-02-18 07:00:00-08 (1排)
扩展Convert/Cast解决方案,在Microsoft SQL Server 2008中,您可以执行以下操作:

cast(cast(getdate() as date) as datetime)
只需将
getdate()
替换为任何datetime列即可

此转换中不涉及任何字符串

这对于特殊查询或更新是可以的,但是对于键联接或大量使用的处理,最好在处理中处理转换,或者重新定义表以具有适当的键和数据

在2005年,您可以使用messier floor:
cast(floor(cast(getdate()作为float))作为datetime)

我也不认为这会使用字符串转换,但我无法将实际效率与纸上谈兵的估计值进行比较。

多年来,我曾多次将其用作地板日期的参考,并将其工作转移到一个您可能会发现有用的功能中

我对它的性能没有任何要求,只是将它作为一种工具提供给用户

我要求,如果您决定对这个答案进行投票,请也进行投票,因为我的代码是他的派生代码。

IF OBJECT_ID('fn_FloorDate') IS NOT NULL DROP FUNCTION fn_FloorDate
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[fn_FloorDate] (
  @Date DATETIME = NULL,
  @DatePart VARCHAR(6) = 'day'
)
RETURNS DATETIME
AS
BEGIN
  IF (@Date IS NULL)
    SET @Date = GETDATE();

  RETURN
  CASE
    WHEN LOWER(@DatePart) = 'year' THEN DATEADD(YEAR, DATEDIFF(YEAR, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'month' THEN DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'day' THEN DATEADD(DAY, DATEDIFF(DAY, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'hour' THEN DATEADD(HOUR, DATEDIFF(HOUR, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'minute' THEN DATEADD(MINUTE, DATEDIFF(MINUTE, 0, @Date), 0)
    WHEN LOWER(@DatePart) = 'second' THEN DATEADD(SECOND, DATEDIFF(SECOND, '2000-01-01', @Date), '2000-01-01')
    ELSE DATEADD(DAY, DATEDIFF(DAY, 0, @Date), 0)
  END;
END
用法:

DECLARE @date DATETIME;
SET @date = '2008-09-17 12:56:53.430';

SELECT
  @date AS [Now],--2008-09-17 12:56:53.430
  dbo.fn_FloorDate(@date, 'year') AS [Year],--2008-01-01 00:00:00.000
  dbo.fn_FloorDate(default, default) AS [NoParams],--2013-11-05 00:00:00.000
  dbo.fn_FloorDate(@date, default) AS [ShouldBeDay],--2008-09-17 00:00:00.000
  dbo.fn_FloorDate(@date, 'month') AS [Month],--2008-09-01 00:00:00.000
  dbo.fn_FloorDate(@date, 'day') AS [Day],--2008-09-17 00:00:00.000
  dbo.fn_FloorDate(@date, 'hour') AS [Hour],--2008-09-17 12:00:00.000
  dbo.fn_FloorDate(@date, 'minute') AS [Minute],--2008-09-17 12:56:00.000
  dbo.fn_FloorDate(@date, 'second') AS [Second];--2008-09-17 12:56:53.000

有几种方法可以剥这只猫的皮=)


DateAdd和DateDiff可以帮助完成许多不同的任务。例如,您可以查找任何月份的最后一天,也可以查找上个月或下个月的最后一天

----Last Day of Previous Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
LastDay_PreviousMonth
----Last Day of Current Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
LastDay_CurrentMonth
----Last Day of Next Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0))
LastDay_NextMonth

事实上,这比dateadd(day,datediff(day,0,@datetime),0)多25%的字符,所以键入起来并不容易。它的效率也降低了15%。@Portman-你说它的效率降低了15%有什么根据吗?因为它会跳过任何日期时间索引,所以对地板的播放会损害性能。使用SQL 2008时,最好使用datediff函数或强制转换([field]作为时间)或强制转换([field]作为日期)这在SQL Server 2008 R2中不起作用:不允许从数据类型DATE显式转换为float@droid-我刚刚在SQL Server 2014中对其进行了测试,效果良好。我们发现CONVERT()的性能比dateadd/datediff低10%到5倍。SQL对数字类型和字符串之间的转换施加了惩罚,然后再转换回来。计算偏移量的日期不必是过去。任何日期都是有效的,只要它本身是“地板”的间隔问题。如果基准日期是在未来,您只会得到一个负的偏移值…如果星期天是一周的第一天,请使用此值。。。选择dateadd(week,datediff(week,0,@datetime),-1)如果星期一是一周的第一天,则使用此选项。。。选择dateadd(week,datediff(week,0,@datetime),0)不确定为什么此答案不在顶部,这对于Microsoft SQL Server中的日期格式非常有效先前的答案建议了这一点,并对其进行了评论(较慢)“SQL Server”指的是Microsoft的SQL DBMS。这个名字确实很让人困惑。我建议你在“年”时使用小写(@DatePart),而不是在小写时使用小写(…以避免所有不必要的代码和较低的转换。
----Last Day of Previous Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
LastDay_PreviousMonth
----Last Day of Current Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
LastDay_CurrentMonth
----Last Day of Next Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0))
LastDay_NextMonth