Преобразование даты в день недели в SQL Server

#sql-server #ms-access

#sql-сервер #ms-access

Вопрос:

Я хотел бы преобразовать SQL-запрос в MS Access в SQL Server. Этот запрос касается преобразования даты в день недели. Пожалуйста, сообщите.

MS Access:

 UPDATE Contact_Hist 
SET WK_DAY = weekdayname(weekday(cdate(mid(date_id,5,2) amp; "/" amp; right(date_id,2) amp; "/" amp; left(date_id,4))));
  

Например, DATE_ID = 20140703 согласно таблице ( Contact_Hist ) и хотел бы преобразовать в день недели, т.е. 'Thursday' .

Комментарии:

1. DATENAME(DW, GETDATE()) вернет ‘Thursday’ в sql server

Ответ №1:

Вы должны использовать DatePart() функцию SQL Server:

 DatePart(weekday, Cast('20140703' AS date))
  

Это вернет целое число от 1 (Понедельник) и 7 (Воскресенье) включительно.

<правка2>

То, как интерпретируется DatePart() возвращаемое значение [integer], определяется SET DATEFIRST настройками SQL Server (или конфигурацией по умолчанию). То есть, является ли возвращаемое значение 1 понедельником, 2 — понедельником и так далее.

</edit2>

<редактировать>

Чтобы получить название дня недели, используйте DateName() функцию.

 DateName(weekday, Cast('20140703' AS date))
  

Для справочных целей оба DatePart() и DateName() принимают «дату» (то есть значение time, date, smalldatetime, datetime, datetime2 или datetimeoffset) в качестве второго параметра. SQL Server неявно преобразует строку даты в дату, поэтому CAST('20140703' AS date) это не требуется.

</редактировать>

Комментарии:

1. Вы можете использовать DATENAME для получения строки вместо целого числа.

2. 1 (Monday) — Я вижу понедельник как 2.

3. Это значение зависит от того, как настроен ваш сервер SET DATEFIRST .

Ответ №2:

В MS SQL Server 2012 вы можете сделать следующее и вернуть «пятницу» обратно:

 SELECT DATENAME ( weekday , '20140704' )
  

как показано в этом SQLFiddle:http://sqlfiddle.com /#!6/fc24a/8


Итак, сделайте:

 UPDATE Contact_Hist SET WK_DAY = DATENAME ( weekday , date_id )
  

Комментарии:

1. Спасибо за информацию! Но я все еще получаю ошибку при выполнении запроса. Date_id является типом данных с плавающей запятой и должен быть преобразован в date. Не могли бы вы, пожалуйста, помочь?

2. Вы преобразуете это в дату или строку?

3. @user3802118 вы можете преобразовать в int, а затем в varchar / string следующим образом: SELECT DATENAME ( weekday , CONVERT(varchar,CONVERT(int,20140704.0))) ) таким образом, ваш полный запрос в конечном итоге будет UPDATE Contact_Hist SET WK_DAY = DATENAME ( weekday , (CONVERT(varchar,CONVERT(int,20140704.0))) )