【发布时间】:2009-06-24 20:04:33
【问题描述】:
我有一个字符串“2009-06-24 09:52:43.000”,我需要将其插入到表的 DateTime 列中。
但我不在乎时间,只想将其插入为 2009-06-24 00:00:00.000
如何在 T-SQL 中做到这一点?
【问题讨论】:
标签: sql sql-server sql-server-2005 tsql
我有一个字符串“2009-06-24 09:52:43.000”,我需要将其插入到表的 DateTime 列中。
但我不在乎时间,只想将其插入为 2009-06-24 00:00:00.000
如何在 T-SQL 中做到这一点?
【问题讨论】:
标签: sql sql-server sql-server-2005 tsql
对于 SQL Server 2005 及以下版本:
CONVERT(varchar(8), @ParamDate, 112) -- Supported way
CAST(FLOOR(CAST(@ParamDate AS float)) AS DATETIME) -- Unsupported way
对于 SQL Server 2008 及更高版本:
CAST(@ParamDate AS DATE)
【讨论】:
declare @originalDate datetime
select @originalDate = '2009-06-24 09:52:43.000'
declare @withoutTime datetime
select @withoutTime = dateadd(d, datediff(d, 0, @originalDate), 0)
select @withoutTime
【讨论】:
SELECT CAST(CONVERT(VARCHAR,GETDATE(),102) AS DATETIME)
SELECT CAST(CONVERT(VARCHAR(10),'2009-06-24 09:52:43.000',102) AS DATETIME)
【讨论】:
我发现先转换为日期,然后转换为日期时间非常有效且直观。
SELECT CAST(CAST(GETDATE() as date) as datetime)
【讨论】:
对不受支持版本的增强:
我不确定这是否会影响任何性能。 getdate() 是我查询中的输入时间戳。
select cast(cast(getdate() as DATE) as DATETIME)
【讨论】:
詹姆斯是对的。如果您从字符串开始,并且格式将始终如您所说,那么您要保持简单和高效。将LEFT( @StrDate, 10) 和CONVERT 用于您的日期时间值。完成。
如果您的输入字符串可以是任何有效的日期/时间格式,那么您必须首先使用CONVERT(datetime, @StrDate)。之后,您按照 Bing 刚刚所说的方式去除时间部分。
【讨论】:
如果您将始终使用相同格式的日期,即 yyyy-MM-DD,您可以获取前 10 个字符(如果该值)并插入该日期的 00:00:00.0000 时间的等效值。
select left('2009-12-32 4:32:00',10)
这是一种非常有效的方法,因为它不需要转换数据类型。但是,它确实要求日期始终使用四位数的年份和两位数的日期和月份进行格式化。
【讨论】:
将其转换为日期,然后您可以使用 CONVERT 来获取日期。
INSERT MyTable(Column1)
SELECT CONVERT(CHAR(8), CAST('2009-06-24 09:52:43.000' AS DATETIME), 112)
【讨论】:
这可能是一种更清洁、更便携的方式,但我多年的习惯用法是:
insert into tbl (date_column)
select convert(varchar, convert (datetime, '2009-06-24 09:52:43.000'), 101)
【讨论】:
各种黑客:
convert,以仅使用日期部分将您的日期时间转换为字符串substring 砍掉结尾floor 对日期时间进行四舍五入
【讨论】:
剥离时间,并将其转换为日期:
select cast(left(yourstring, 10) as datetime)
【讨论】: