簡體   English   中英

在轉換為函數SQL之前指定字符串日期格式

[英]Specify string date format before casting in a function SQL

我有一種將字符串日期轉換為日期格式的方案。 但是日期字符串不是直接格式,因此轉換將引發錯誤。 所以我嘗試的是

set dateformat dmy

在sql中進行轉換之前,它沒有任何問題。

但是麻煩是我需要在視圖或函數中實現它。 但是令人失望的部分,函數或視圖不支持將setdateformat表示為副作用運算符

那么在轉換為函數或視圖之前,如何指定給定字符串的日期格式?

正如Damien在對問題的評論中所寫的那樣,理想情況下,首先您不應該弄亂日期時間的字符串表示形式-您應該使用適當的數據類型-並且由於您詢問創建視圖的原因,因此只能表示您的數據庫中有一個以字符串形式存儲的datetime值。
解決此問題的方法是更改​​存儲此值的方式-將DateTime2用作日期時間值,將Date用作僅日期值,或將Time用作一天中的時間值。

進一步閱讀-亞倫·伯特蘭德的不良習慣:選擇錯誤的數據類型

假設您無法更改數據庫設計,請閱讀此答案的其余部分。

您不能在視圖或函數上使用set dateformat ,但可以使用convert而不是castdatetime值的字符串表示形式更改為實際datetime值,前提是該字符串表示形式具有受支持的日期格式之一 (其中有很多,因此通常不應該有問題)。

如果datetime字符串表示形式是內置convert功能不支持的格式,則可能需要以字符串操作的形式進行一些額外的工作,以將其更改為支持的格式,或者(大小寫),將字符串表示形式分成幾部分,然后使用datetimefromparts.

如果您可以使用datetime格式的字符串表示形式提供您正在使用的實際格式,我可能可以編輯此答案以確切地向您展示如何執行此操作。

CONVERT()的第三個參數允許提供格式類型。

假設您的SET DATEFORMAT DMY我要處理的日期,例如“ 1/2/2000”,即2000年2月1日。

嘗試這個:

DECLARE @d VARCHAR(100)='1/2/2000';

SELECT CONVERT(DATE,@d,104)

104德語類型,年份為4位數字。 如果這不符合您的需求,則可以通過該鏈接找到更合適的格式。

如果您需要進一步的幫助,請提供實際日期的樣本。

提示 :您應該始終將值存儲在具有適當類型的列中。 將日期存儲為字符串會使事情變慢,並打開許多錯誤源...

SELECT CONVERT(varchar(10),CAST('07/01/2018' AS DATE),23)

結果

2018-07-01

不知道您的意思是“日期字符串不是直接格式”。 例子會有所幫助。 您是否嘗試過解析而不是強制轉換?

SELECT 
    TRY_PARSE(thedate AS datetime)  as justParse
    ,TRY_PARSE(thedate AS datetime USING 'en-US') as parseUS
    ,TRY_PARSE(thedate AS datetime USING 'en-GB') as parseGB
    ,try_cast(thedate as date) as tryCast
FROM (values 
('07/01/2018')
,('01/07/2018')
,('07 jan 2018')
,('jan 07 2018')
,('Monday, 7 January 2019')
)d(thedate)

暫無
暫無

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

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