iT邦幫忙

0

玩玩SQL~在資料表中搜尋日期有哪幾天?

sql

隨便你用哪個SQL@@~我是使用MSSQL

這次應該就沒有字元長度問題了~應該比較簡單點^^"

declare @Tmp table(
	StrTmp nvarchar(100)
)

insert into @Tmp
values(N'你知道嗎?中秋節是2021/09/21(二),但2021/09/20(一)也是放假日唷')
,(N'2021年最後一個假期2021/10/11(一)嗎?還是2021/12/31(五)呢?')
,(N'雙十節日2021/10/10(日)剛好在星期日呢')

https://ithelp.ithome.com.tw/upload/images/20210702/20061369KiJ4hf0Zqh.png


這次大家都動作滿快查詢出來~
晚點再貼我的查詢方式@@"


以下我用取10個字元比對是否為日期,再列出來~

select SUBSTRING(StrTmp,Sort,10) ShowDate
from @Tmp
,(
	select Row_Number()Over(order by [number]) as Sort
	from master..spt_values
) as k
where Sort <= len(StrTmp)
and isDate(SUBSTRING(StrTmp,Sort,10)) = 1
order by SUBSTRING(StrTmp,Sort,10)
2
allenlwh
iT邦高手 1 級 ‧ 2021-07-02 14:15:52
最佳解答
DECLARE @result table (ShowDate varchar(10))

DECLARE @tmpstr varchar(200)
DECLARE @pos int

DECLARE myCURSOR CURSOR FOR
	SELECT StrTmp from @Tmp

OPEN myCURSOR
FETCH NEXT FROM myCURSOR INTO @tmpstr
WHILE @@FETCH_STATUS = 0 
BEGIN 	
	set @pos=1
	while @pos>0
	begin		
		select @pos=PATINDEX('%[0-9][0-9][0-9][0-9]/%',@tmpstr)
		if (@pos>0)
		begin
			insert into @result
				select substring(@tmpstr,@pos,10)

			set @tmpstr=substring(@tmpstr,@pos+10,len(@tmpstr)-10)
		end
	end

	FETCH NEXT FROM myCURSOR INTO @tmpstr
END 

CLOSE myCURSOR 
DEALLOCATE myCURSOR		

select ShowDate from @result
	order by ShowDate

喔~用T-SQL搞定~~

你貼的答案最快~先給你~

allenlwh iT邦高手 1 級 ‧ 2021-07-02 16:07:36 檢舉

各位前輩~失禮了!

1
rogeryao
iT邦大師 1 級 ‧ 2021-07-02 14:30:03
CREATE TABLE Tmp (
StrTmp nvarchar(100));

INSERT INTO Tmp
values(N'你知道嗎?中秋節是2021/09/21(二),但2021/09/20(一)也是放假日唷')
,(N'2021年最後一個假期2021/10/11(一)嗎?還是2021/12/31(五)呢?')
,(N'雙十節日2021/10/10(日)剛好在星期日呢');
WITH CTE_X1 AS (
SELECT StrTmp,
SUBSTRING(StrTmp,CHARINDEX('(', StrTmp)-10,10) AS STRA,
SUBSTRING(StrTmp,CHARINDEX('(', StrTmp)+1,LEN(StrTmp)-CHARINDEX('(', StrTmp)) AS STRB,
CHARINDEX('(', StrTmp) AS NUM
FROM Tmp
UNION ALL
SELECT StrTmp,
SUBSTRING(STRB,CHARINDEX('(', STRB)-10,10) AS STRA,
SUBSTRING(STRB,+CHARINDEX('(', STRB)+1,LEN(STRB)-CHARINDEX('(', STRB)) AS STRB,
NUM + 1 AS NUM
FROM CTE_X1
WHERE LEN(StrTmp) - NUM>0
)

SELECT STRA
FROM CTE_X1 AS A
WHERE STRA <>''
ORDER BY STRA 

Demo

看更多先前的回應...收起先前的回應...

哈~老樣子~用WITH處理~

rogeryao iT邦大師 1 級 ‧ 2021-07-02 14:35:48 檢舉

直覺...沒想太多,就玩一下

那我就先把解答最快的給第一個好了~

rogeryao iT邦大師 1 級 ‧ 2021-07-02 16:00:38 檢舉

^_^

allenlwh iT邦高手 1 級 ‧ 2021-07-02 16:08:11 檢舉

前輩~失禮了!

rogeryao iT邦大師 1 級 ‧ 2021-07-02 16:29:18 檢舉

^_^

1
ckp6250
iT邦好手 1 級 ‧ 2021-07-02 17:36:27

日期未必是10個字,
2021/09/21,20210921也是日期,
固定切10字元來判斷,不足啦。

哈~題目我有考慮過這問題~我設定比較簡單的題目日期~
要看狀況~去修改條件判斷才會符合你的判斷設定~

ckp6250 iT邦好手 1 級 ‧ 2021-07-02 20:38:43 檢舉

題目是由【文字中提取日期】,那麼就沒法禁止使用者輸入任何【像是日期的文字】比如,【2021/6/3】或【2021年6月5日】,所以,若僅以10個字元做切割,肯定不行啦。

所以說只能不斷修正提取日期的判斷囉^^"
至於需求多複雜就只能看文字內的日期類型而定了~
因為日期表示方式可到上百種O_O|||

1
一級屠豬士
iT邦大師 1 級 ‧ 2021-07-03 10:00:33
create table it210703 (
  txt text
);

insert into it210703 values
 ('你知道嗎?中秋節是2021/09/21(二),但2021/09/20(一)也是放假日唷')
,('2021年最後一個假期2021/10/11(一)嗎?還是2021/12/31(五)呢?')
,('雙十節日2021/10/10(日)剛好在星期日呢');

create or replace function is_date(s varchar) 
returns boolean
language plpgsql as
$code$
begin
  perform s::date;
  return true;
exception when others then
  return false;
end;
$code$;

with t1 (datetxt) as (
select unnest(regexp_matches(txt, '\d{4}.\d{2}.\d{2}', 'g'))
  from it210703
)
select datetxt
     , is_date(datetxt)
  from t1;
  
  datetxt   | is_date
------------+---------
 2021/09/21 | t
 2021/09/20 | t
 2021/10/11 | t
 2021/12/31 | t
 2021/10/10 | t
(5 rows)

這句regexp_matches真好~SQL Server沒有正規化取代函數Q_Qa
不過PostgreSQL沒有判斷字串is_date是否為日期@@...

is_date 這類的沒有內建,但是有一個很好用的 extension
https://github.com/sjstoelting/pgsql-tweaks
有很多方便的函數,有包含 is_date(), is_timestamp() 等等.

我要發表回答

立即登入回答