sql getdate()只要日期不要时间

本文介绍如何在SQL中仅获取日期而不包含时间部分,包括使用CONVERT函数的两种方法,以及详细的参数说明和使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sql getdate()只要日期不要时间

2008年01月17日 星期四 11:42 P.M.

 

方法一:

通过getdate() 和convert函数可以得到日期,不要时间:

CONVERT(datetime,   CONVERT(char(20),   GETDATE(),   110))

其中110 是显示格式为     yyyy-mm-dd

方法二:

convert(varchar(10),regtime,121)

regtime 是表中注册时间字段

-----------------------------------------------------------------------------

使用 CONVERT:

CONVERT (data_type[(length)], expression [, style])

参数

expression

是任何有效的 Microsoft   SQL Server 表达式。有关更多信息,请参见表达式。

data_type

目标系统所提供的数据类型,包括 bigint 和 sql_variant。不能使用用户定义的数据类型。有关可用的数据类型的更多信息,请参见数据类型。

length

nchar、nvarchar、char、varchar、binary 或 varbinary 数据类型的可选参数。

style

日期格式样式,借以将 datetime 或 smalldatetime 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型);或者字符串格式样式,借以将 float、real、money 或 smallmoney 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型)。

SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式。

在表中,左侧的两列表示将 datetime 或 smalldatetime 转换为字符数据的 style 值。给 style 值加 100,可获得包括世纪数位的四位年份 (yyyy)。

不带世纪数位 (yy) 带世纪数位 (yyyy)      标准      输入/输出**     

0 或 100 (*) 默认值 mon dd yyyy hh:miAM(或 PM)

1 101 美国 mm/dd/yyyy

2 102 ANSI yy.mm.dd

3 103 英国/法国 dd/mm/yy

4 104 德国 dd.mm.yy

5 105 意大利 dd-mm-yy

6 106 - dd mon yy

7 107 - mon dd, yy

8 108 - hh:mm:ss     

9 或 109 (*) 默认值 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM)

10 110 美国 mm-dd-yy

11 111 日本 yy/mm/dd

12 112 ISO yymmdd    

13 或 113 (*) 欧洲默认值 + 毫秒 dd mon yyyy hh:mm:ss:mmm(24h)

14 114 - hh:mi:ss:mmm(24h)     

20 或 120 (*) ODBC 规范 yyyy-mm-dd hh:mm:ss[.fff]     

21 或 121 (*) ODBC 规范(带毫秒) yyyy-mm-dd hh:mm:ss[.fff]     

126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(不含空格)

- 130* 科威特 dd mon yyyy hh:mi:ss:mmmAM

- 131* 科威特 dd/mm/yy hh:mi:ss:mmmAM

* 默认值(style 0 或 100、9 或 109、13 或 113、20 或 120、21 或 121)始终返回世纪数位 (yyyy)。

** 当转换为 datetime 时输入;当转换为字符数据时输出。

*** 专门用于 XML。对于从 datetime 或 smalldatetime 到 character 数据的转换,输出格式如表中所示。对于从 float、money 或 smallmoney 到 character 数据的转换,输出等同于 style 2。对于从 real 到 character 数据的转换,输出等同于 style 1。

<think>我们被要求将SQL中的时间戳转换为日期格式。根据提供的引用,不同SQL方言(如SQLServer、PostgreSQL、SparkSQL)有不同的实现方式。下面将分别介绍几种常见SQL引擎的时间戳转日期方法。###一、SQLServer中的转换(参考引用[^1])在SQLServer中,时间戳通常指自1970-01-0100:00:00UTC(或特定时区)以来的秒数(或毫秒数)。转换方法如下:####1.秒级时间戳转日期```sql--假设时间戳是秒级(如引用[^1]中的方法)DECLARE@timestampBIGINT=1750799932;--示例时间戳(秒)--使用DATEADD函数,从'1970-01-0108:00:00'开始加秒(北京时间区UTC+8)SELECTDATEADD(SECOND,@timestamp,'1970-01-0108:00:00')ASConvertedDate;```####2.毫秒级时间戳转日期如果时间戳是毫秒级(如1750799932681),则需要先转换为秒(除以1000):```sqlDECLARE@timestamp_msBIGINT=1750799932681;--毫秒转秒:注意整数除法会截断,所以先转成毫秒间隔再相加SELECTDATEADD(MILLISECOND,@timestamp_ms%1000,DATEADD(SECOND,@timestamp_ms/1000,'1970-01-0108:00:00'))ASConvertedDate;```###二、PostgreSQL中的转换(参考引用[^2][^4])PostgreSQL支持直接使用`TO_TIMESTAMP`函数将时间戳(秒)转换为时间戳类型,再用`TO_CHAR`格式化为日期字符串。####1.秒级时间戳转日期```sql--将时间戳(秒)转换为日期字符串SELECTTO_CHAR(TO_TIMESTAMP(1750799932),'yyyy-MM-ddHH:mm:ss')ASformatted_date;```####2.毫秒级时间戳转日期需先将毫秒转换为秒(除以1000.0):```sqlSELECTTO_CHAR(TO_TIMESTAMP(1750799932681/1000.0),'yyyy-MM-ddHH:mm:ss')ASformatted_date;```###三、SparkSQL中的转换(参考引用[^3])SparkSQL使用类似PostgreSQL的语法,常用`to_timestamp`和`date_format`函数。####1.秒级时间戳转日期```sqlSELECTdate_format(to_timestamp(1750799932),'yyyy-MM-dd')ASdate;--只取日期部分--或完整时间SELECTdate_format(to_timestamp(1750799932),'yyyy-MM-ddHH:mm:ss')ASformatted_date;```####2.毫秒级时间戳转日期在SparkSQL中,`to_timestamp`函数默认处理秒级时间戳,所以需要将毫秒时间戳除以1000:```sqlSELECTdate_format(to_timestamp(1750799932681/1000),'yyyy-MM-ddHH:mm:ss')ASformatted_date;```###四、MySQL中的转换(参考引用[^4])MySQL使用`FROM_UNIXTIME`函数将秒级时间戳转换为日期格式。####1.秒级时间戳转日期```sqlSELECTFROM_UNIXTIME(1750799932,'%Y-%m-%d%H:%i:%s')ASformatted_date;```####2.毫秒级时间戳转日期MySQL的`FROM_UNIXTIME`不支持毫秒,需先转为秒,然后加上毫秒部分:```sqlSET@timestamp_ms=1750799932681;SELECTFROM_UNIXTIME(@timestamp_msDIV1000,'%Y-%m-%d%H:%i:%s')||'.'||LPAD(@timestamp_msMOD1000,3,'0')ASformatted_date;--或者忽略毫秒部分SELECTFROM_UNIXTIME(1750799932681/1000,'%Y-%m-%d%H:%i:%s')ASformatted_date;```###五、通用注意事项1.**时区问题**:所有转换都依赖于数据库服务器的时区设置。例如,SQLServer示例中使用了'1970-01-0108:00:00'(UTC+8)作为起点。建议在转换时显式指定时区。2.**时间戳单位**:务必确认时间戳是秒还是毫秒。毫秒级时间戳需要额外处理(除以1000)。3.**日期格式**:根据需要调整输出格式(如'yyyy-MM-dd'只显示日期)。###示例汇总(以毫秒级时间戳1750799932681为例)|SQL引擎|转换代码(输出完整日期时间)||---------------|------------------------------||SQLServer|`SELECTDATEADD(MILLISECOND,1750799932681%1000,DATEADD(SECOND,1750799932681/1000,'1970-01-0108:00:00'))`||PostgreSQL|`SELECTTO_CHAR(TO_TIMESTAMP(1750799932681/1000.0),'yyyy-MM-ddHH:mm:ss')`||SparkSQL|`SELECTdate_format(to_timestamp(1750799932681/1000),'yyyy-MM-ddHH:mm:ss')`||MySQL|`SELECTFROM_UNIXTIME(1750799932681/1000,'%Y-%m-%d%H:%i:%s')`|###常见问题-**日期格式不匹配**:调整格式字符串(如`yyyy`改为`YY`)。-**时区转换**:在数据库会话中设置时区(如PostgreSQL的`SETTIMEZONE'UTC';`)。-**性能优化**:对大数据集,避免在WHERE条件中使用函数转换(可预先计算存储)。如需进一步帮助,请提供您使用的具体SQL引擎和表结构。§§相关问题§§1.SQL中如何将日期转换为时间戳?2.如何处理不同时区的时间戳转换?3.在SQL查询中如何优化时间戳与日期的转换性能?</think>### SQL 时间戳转日期方法详解 根据您的需求(SQL 时间戳转日期)和站内引用,以下是不同 SQL 引擎的转换方法总结: --- #### 一、SQL Server 方法(参考引用[^1]) **场景**:将数值型时间戳(秒级)转为日期 ```sql -- 方法1:使用 DATEDIFF 逆运算 DECLARE @timestamp BIGINT = 1750799932; -- 秒级时间戳示例 SELECT DATEADD(SECOND, @timestamp, '1970-01-01 08:00:00') AS ConvertedDate; -- 输出:2025-07-24 12:58:52.000(UTC+8) -- 方法2:直接转换当前时间戳 SELECT DATEADD(SECOND, DATEDIFF(SECOND, '1970-01-01 08:00:00', GETDATE()), '1970-01-01') AS CurrentTime; ``` **毫秒级时间戳处理**: ```sql DECLARE @milliseconds BIGINT = 1750799932681; SELECT DATEADD(MILLISECOND, @milliseconds % 1000, DATEADD(SECOND, @milliseconds / 1000, '1970-01-01 08:00:00')) AS PreciseDate; ``` --- #### 二、PostgreSQL/Greenplum 方法(参考引用[^2]) **核心函数**:`TO_TIMESTAMP()` + `TO_CHAR()` ```sql -- 秒级时间戳转日期字符串 SELECT TO_CHAR(TO_TIMESTAMP(1750799932), 'yyyy-MM-dd HH:mm:ss') AS formatted_date; -- 输出:2025-07-24 12:58:52 -- 毫秒级时间戳处理(先除以1000) SELECT TO_CHAR(TO_TIMESTAMP(1750799932681 / 1000.0), 'yyyy-MM-dd HH:mm:ss') AS formatted_date; -- 只获取日期部分 SELECT TO_CHAR(TO_TIMESTAMP(1750799932), 'yyyy-MM-dd') AS date_only; ``` --- #### 三、Spark SQL 方法(参考引用[^3]) **核心函数**:`to_timestamp()` + `date_format()` ```scala // Spark DataFrame API 示例 val dfWithDate = df.withColumn("date", date_format(to_timestamp($"timestamp_col" / 1000), "yyyy-MM-dd HH:mm:ss") ) // 纯 Spark SQL 语法 spark.sql(""" SELECT date_format(to_timestamp(timestamp_col / 1000), 'yyyy-MM-dd') AS date FROM table """) ``` --- #### 四、MySQL 方法(参考引用[^4]) **核心函数**:`FROM_UNIXTIME()` ```sql -- 秒级时间戳转换 SELECT FROM_UNIXTIME(1750799932, '%Y-%m-%d %H:%i:%s') AS formatted_date; -- 毫秒级时间戳处理 SELECT FROM_UNIXTIME(1750799932681 / 1000, '%Y-%m-%d %H:%i:%s') AS formatted_date; -- 自定义格式(只要日期) SELECT DATE(FROM_UNIXTIME(1750799932)) AS date_only; ``` --- #### 五、跨引擎通用方案 ```sql /* 通用逻辑(需适配具体数据库函数) */ SELECT DATE_ADD('1970-01-01', INTERVAL (timestamp_col / 1000) SECOND) AS converted_date FROM your_table; ``` --- ### 关键注意事项 1. **时间戳单位**: - 秒级时间戳:直接使用 - 毫秒级时间戳:需先 `/1000` - 示例:`1750799932681`(毫秒)→ `1750799932.681`(秒) 2. **时区处理**: ```sql -- PostgreSQL 显式设置时区 SET TIME ZONE 'Asia/Shanghai'; SELECT TO_TIMESTAMP(1750799932) AT TIME ZONE 'UTC+8'; ``` 3. **性能优化**: - 避免在 `WHERE` 子句中转换:预先计算存储日期列 - 大数据场景:Spark 分区时使用时间戳而非字符串 4. **格式符号对照**: | 符号 | 含义 | SQL Server | MySQL | PostgreSQL | |------|------------|------------|---------|------------| | `%Y` | 四位年份 | `yyyy` | `%Y` | `YYYY` | | `%m` | 月份(01-12)| `MM` | `%m` | `MM` | | `%d` | 日(01-31) | `dd` | `%d` | `DD` | > 在线验证工具:[Epoch Converter](https://www.epochconverter.com) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值