暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在 SQL Server 中检查当前日期和时间(时间戳)的 SQL 命令

原创 Bigbig 2022-10-09
6796

本文探讨了在 SQL Server 中返回当前日期和时间(时间戳)的不同 SQL 命令(函数)

介绍

在数据库应用程序中,当前日期和时间以多种方式使用。无论是创建审计日志、销售记录、数据库触发器,还是仅仅因为您需要当前日期和时间,了解检索当前日期和时间的不同方法都非常有用。本文将讨论各种 T-SQL 当前日期函数、何时使用它们以及如何使用它们。

本文探讨 SQL Server、Azure SQL 数据库、托管实例 (MI) 和 Azure Synapse Analytics 的 DateTime SQL 命令(函数)。

  • 获取日期()
  • CURRENT_TIMESTAMP
  • SYSDATETIME
  • 获取UTC日期
  • SYSUTCDATETIME
  • SYSDATETIMEOFFSET

让我们开始探索这些文章并了解它们之间的区别。

SQL Server GETDATE() 函数

GETDATE() SQL 命令(函数)返回系统时间戳而不指定时区偏移量。它根据底层计算机(服务器)时区检索值。返回值数据类型为DateTime。

但是,在 Azure SQL 数据库和 Azure Synapse Analytics 上运行 GETDATE() 函数会返回 UTC(通用时间坐标)。

image.png

您可以从 GETDATE() 函数中添加或减去日期。例如,GETDATE()-1 返回昨天的时间戳,而 GETDATE()+1 返回明天的时间戳。

  SELECT getdate()-1 AS Yesterday,
    getdate() AS Today,
    getdate()+1 AS Tomorrow

image.png

如果我们需要解释 Azure SQL 数据库或 SQL Server 的返回值非 UTC 时区,请使用 AT TIME ZONE 函数。

例如,假设我们想从 getdate() 函数获取印度标准时间 (IST) 时区值。以下脚本将当前时区定义为 UTC,然后将其转换为所需的时区值。

 SELECT GETDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time'

image.png

查询下面的系统表以获取支持的 Azure 时区列表。

SELECT name AS TimeZone, Current_UTC_offset FROM sys.time_zone_info

image.png

CURRENT_TIMESTAMP

CURRENT_TIMESTAMP SQL 命令(函数)返回类似于 GETDATE() 函数的系统时间戳。它是 GETDATE() 函数的 ANSI 等效函数,可以在 T-SQL 语句中互换使用。

image.png

如下所示,我们可以使用 AT TIME ZONE 函数将 GETDATE() 替换为 CURRENT_TIMESTAMP 以检索所需的时区值。

SELECT CURRENT_TIMESTAMP AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time'

image.png

SYSDATETIME()

SYSDATETIME() 函数在几分之一秒内返回更精确的值。返回值数据类型为 datetime2,精度为 7。

GETUTCDATE() 和 SYSUTCDATETIME()

假设您需要获取 UTC 时间戳,而不管您的系统时区如何。在这种情况下,您可以使用 SQL 命令(函数)GETUTCDATE(),如下所示。

image.png

  • 返回值数据类型:日期时间
  • 包括时区偏移:否

SYSUTCDATE() 还以更高的精度返回 UTC 区域值。其返回值数据类型为 DateTime2,精度为 7。

SELECT SYSUTCDATETIME() 

image.png

SYSDATETIMEOFFSET()

SYSDATETIMEOFFSET() SQL 命令(函数)根据底层操作系统时区返回一个值。它包括更高的精度以及时区偏移。

如下所示,它包含一个 +00:00 时区偏移量,表明它是 UTC。

image.png

查询以检查不同 DateTime 函数返回的输出

以下查询在 SELECT 语句中组合了所有 SQL Server DateTime 函数。您可以运行以下查询来比较返回的值。它从GETDATE()CURRENT_TIMESTAMPSYSDATETIMESYSDATETIMEOFFSETGETUTCDATESYSUTCDATETIME 返回值,如下所示。

 SELECT 
  GETDATE() AS [GETDATE()]
  ,CURRENT_TIMESTAMP AS [CURRENT_TIMESTAMP]  
  ,SYSDATETIME() AS [SYSDATETIME()]  
  ,SYSDATETIMEOFFSET() AS [SYSDATETIMEOFFSET()]  
  ,GETUTCDATE() AS [GETUTCDATE()]
  ,SYSUTCDATETIME() AS [SYSUTCDATETIME()] ;

在我的 Azure SQL 数据库中,它返回了以下值。

  • 获取日期():2021-12-25 02:50:40.767
  • CURRENT_TIMESTAMP:2021-12-25 02:50:40.767
  • SYSDATETIME():2021-12-25 02:50:40.7500000
  • SYSDATETIMEOFFSET(): 2021-12-25 02:50:40.7500000 +00:00
  • GETUTCDATE(): 2021-12-25 02:50:40.753
  • SYSUTCDATETIME:2021-12-25 02:50:40.7534774

在许多情况下,我们不需要时间戳或偏移值。在这种情况下,我们可以使用 CONVERT() 函数,所有函数都返回日期,如下所示。

SELECT 
  CONVERT (date,GETDATE()) AS [GETDATE()]
  ,CONVERT (date,CURRENT_TIMESTAMP) AS [CURRENT_TIMESTAMP]  
  ,CONVERT (date,SYSDATETIME()) AS [SYSDATETIME()]  
  ,CONVERT (date,SYSDATETIMEOFFSET()) AS [SYSDATETIMEOFFSET()]  
  ,CONVERT (date,GETUTCDATE()) AS [GETUTCDATE()]
  ,CONVERT (date,SYSUTCDATETIME()) AS [SYSUTCDATETIME()] ;

image.png
同样,如下所示,我们可以使用 CONVERT() 函数中的时间参数从输出中提取时间戳部分。

SELECT 
 CONVERT (time,GETDATE()) AS [GETDATE()]
 ,CONVERT (time,CURRENT_TIMESTAMP) AS [CURRENT_TIMESTAMP]  
 ,CONVERT (time,SYSDATETIME()) AS [SYSDATETIME()]  
 ,CONVERT (time,SYSDATETIMEOFFSET()) AS [SYSDATETIMEOFFSET()]  
 ,CONVERT (time,GETUTCDATE()) AS [GETUTCDATE()]
 ,CONVERT (time,SYSUTCDATETIME()) AS [SYSUTCDATETIME()] ;

image.png

让我们探索 SQL Server 和 Azure SQL 数据库中各种 DateTime 函数的几个用例。

下面的示例创建一个名为 [DemoSQLTable] 的表,其中包含几列及其来自 DateTime 函数的默认值 - GETDATE()、CURRENT_TIMESTAMP 和 SYSDATETIME()。一旦我们插入一条没有任何显式值的记录,它就会从这些 DateTime 函数中检索数据并将它们存储到各自的列中。

 Create Table DemoSQLTable (
    id int,
    myGETDATE smalldatetime default GETDATE(),
    myCurrentTimeStamp datetime default CURRENT_TIMESTAMP,
    mySYSDATETIME datetime2 default SYSDATETIME()
 );
 GO
 
 insert into DemoSQLTable (ID) values (1);
 GO
 
 Select * from DemoSQLTable;

image.png

我们可以使用 DateTime 函数作为存储过程的参数吗?

我们经常需要满足日期范围或特定日期时间的数据库表中的数据。例如,如果我们将客户的销售记录存储在一个表中,我们可能有兴趣了解今天或特定月份或年份的订单。

让我们使用以下查询创建一个存储过程以进行演示。它定义了一个具有数据类型 DATETIME 的参数@MyDateTime。稍后,我们要根据参数从 [SalesLT].[SalesOrderDetail] 表中过滤记录。

CREATE PROC Test_DateTime_Proc
  @MyDateTime DATETIME
as
SELECT [SalesOrderID]
     ,[SalesOrderDetailID]
     ,[OrderQty]
     ,[ProductID]
     ,[ModifiedDate]
 FROM [SalesLT].[SalesOrderDetail]
 WHERE [ModifiedDate]=@MyDateTime

我们想使用 DateTime 函 Declare @I datetime = getdate()
exec Test_DateTime_Proc @MyDateTime = @I;
GO数为参数 @MyDateTime 提供值。如果我们直接将一个参数值传递给 DateTime 函数,它会返回一个错误,如下所示。

EXEC Test_DateTime_Proc @MyDateTime=getdate()

image.png

要执行以 DateTime 函数作为参数值的存储过程,我们可以声明一个变量并存储函数输出。例如,在 T-SQL 中,我们声明一个参数 @I 并使用 GETDATE() 函数设置它的值。

  Declare @I datetime = getdate()
  exec Test_DateTime_Proc @MyDateTime = @I;
  GO

该脚本工作正常,没有任何错误。就我而言,它没有任何匹配的谓词行;因此,它返回 0 行受影响。
image.png
注意:DateTime 函数在 SQL Server 中是不确定的。因此,无法对列中引用此函数的视图和表达式进行索引。

结论

本文讨论了几种使用 SQL 命令(函数)检索当前日期和时间的方法。我还讨论了何时使用这些功能以及应该如何使用它们。希望本文能给您一些在应用程序中使用这些函数的想法。

如果您对讨论的 DateTime 函数有任何疑问,请将它们留在下面的评论部分。感谢您的学习,请随时在评论中告诉我们您的想法。

原文标题:SQL Commands to check current Date and Time (Timestamp) in SQL Server
原文作者:Rajendra Gupta
原文地址:https://www.sqlshack.com/sql-commands-to-check-current-date-and-time-timestamp-in-sql-server/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论