簡體   English   中英

在SQL Server中將varchar列轉換為日期時間

[英]Convert varchar column to datetime in sql server

我有一個表,其中包含以下定義和數據。

定義:

CREATE TABLE [dbo].[TestTB]
(
    [CREATEDATE] [nvarchar](50) NULL
) ON [PRIMARY]

數據:

 10/9/2014 
 1/26/2015 
 2/16/2015 

當我運行查詢時:

Select 
    CAST(CREATEDATE AS DATETIME) as CREATEDATE 
FROM 
    [dbo].[TestTB]

它拋出錯誤:

消息241,級別16,狀態1,第1行
從字符串轉換日期和/或時間時轉換失敗。

即使運行后以上也不起作用

SET DATEFORMAT dmy

但是下面的查詢工作正常

  DECLARE @data nvarchar(50)
  SET @data =  ' 10/9/2014 '
  Select CAST(@data as DateTime)

以上查詢返回:2014-10-09 00:00:00.000

如何將存儲在列中的日期字符串(格式為mm / dd / yyyy)轉換為datetime?

首先,如果您的表列是“ DateTime”類型,則無論您是否將其轉換為日期,它都會以“ 2014-10-09 00:00:00.000”格式保存數據。 但是,如果不是這樣,並且如果您的SQL Server版本為2008或更高版本,則可以使用此版本,

DECLARE @data nvarchar(50)
SET @data =  '10/9/2014'

IF(ISDATE(@data)>0)
BEGIN
    SELECT CONVERT(DATE, @data)
END

除此以外

DECLARE @data nvarchar(50)
SET @data =  '10/9/2014'

IF(ISDATE(@data)>0)
BEGIN
    SELECT CONVERT(DATETIME, @data)
END

插入表格

INSERT INTO dbo.YourTable
SELECT CREATEDATE FROM
(
    SELECT
        (CASE WHEN (ISDATE(@data) > 0) THEN CONVERT(DATE, CREATEDATE) 
        ELSE CONVERT(DATE, '01/01/1900') END) as CREATEDATE 
    FROM 
        [dbo].[TestTB]
) AS Temp
WHERE
    CREATEDATE <> CONVERT(DATE, '01/01/1900')
DECLARE @data nvarchar(50)
  SET @data =  ' 10/9/2014 '
  SELECT CONVERT(datetime, @data, 101)

SELECT CONVERT(datetime, CREATEDATE, 101) as CREATEDATE 
FROM [dbo].[TestTB]

http://www.sqlfiddle.com/#!6/f2103

請檢查此http://msdn.microsoft.com/en-us/library/aa226054%28SQL.80%29.aspx

試試看:

SELECT IIF(ISDATE(CREATEDATE) = 1, CONVERT(DATETIME, CREATEDATE, 110), CREATEDATE) as DT_CreateDate
FROM [dbo].[TestTB]

SQL小提琴解決方案

nvarchar到datetime是隱式轉換,這意味着您可以執行以下操作:

declare @strDate nvarchar(50), @myDate datetime
set @strDate = '01/26/2013'
set @myDate = @strDate

但是您的問題是日期格式,因此您必須對其進行轉換,但是您必須具體說明格式或樣式,並且所使用的樣式的代碼是101(根據此表 ),因此安全的方法是:

 declare @strDate nvarchar(50), @myDate datetime
 set @strDate = '01/26/2013'
 set @myDate = CONVERT(DATETIME, @strDate, 101)

您可以跳過代碼,但是如果使用不同的配置(服務器),則代碼將中斷。 如果您使用ISO樣式(yyyymmdd),則無需擔心,轉換將是隱式的:

  declare @strDate nvarchar(50), @myDate datetime
  set @strDate = '20150421' --ISO style (yyyymmdd)
  set @myDate = @strDate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM