Jika saya memiliki tanggal 01/01/2009, saya ingin mencari tahu hari apa itu misalnya Senin, Selasa, dll ...
Apakah ada fungsi bawaan untuk ini di SQL Server 2005/2008? Atau apakah saya perlu menggunakan tabel bantu?
Jika saya memiliki tanggal 01/01/2009, saya ingin mencari tahu hari apa itu misalnya Senin, Selasa, dll ...
Apakah ada fungsi bawaan untuk ini di SQL Server 2005/2008? Atau apakah saya perlu menggunakan tabel bantu?
Jawaban:
Gunakan DATENAME
atau DATEPART
:
SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6
Meskipun jawaban SQLMenace telah diterima, ada satu SET
opsi penting yang harus Anda ketahui
DATENAME akan mengembalikan nama tanggal yang benar tetapi tidak dengan nilai DATEPART yang sama jika hari pertama dalam seminggu telah diubah sebagaimana diilustrasikan di bawah ini.
declare @DefaultDateFirst int
set @DefaultDateFirst = @@datefirst
--; 7 First day of week is "Sunday" by default
select [@DefaultDateFirst] = @DefaultDateFirst
set datefirst @DefaultDateFirst
select datename(dw,getdate()) -- Saturday
select datepart(dw,getdate()) -- 7
--; Set the first day of week to * TUESDAY *
--; (some people start their week on Tuesdays...)
set datefirst 2
select datename(dw,getdate()) -- Saturday
--; Returns 5 because Saturday is the 5th day since Tuesday.
--; Tue 1, Wed 2, Th 3, Fri 4, Sat 5
select datepart(dw,getdate()) -- 5 <-- It's not 7!
set datefirst @DefaultDateFirst
( @@datefirst - 1 + datepart(weekday, thedate) ) % 7
. Hari Minggu akan selalu nol.
DayOfWeek
pencacahan memiliki DayOfWeek.Sunday
dengan nilai ... 0
. Jadi, tidak peduli apa DateFirst
setted untuk, sebuah diobati SQL-kembali WEEKDAY
nilai tidak akan pernah kompatibel dengan NET rekan. Yay, Microsoft.
SELECT CASE DATEPART(WEEKDAY,GETDATE())
WHEN 1 THEN 'SUNDAY'
WHEN 2 THEN 'MONDAY'
WHEN 3 THEN 'TUESDAY'
WHEN 4 THEN 'WEDNESDAY'
WHEN 5 THEN 'THURSDAY'
WHEN 6 THEN 'FRIDAY'
WHEN 7 THEN 'SATURDAY'
END
select datename(dw,getdate())
Untuk mendapatkan nilai deterministik untuk hari dalam seminggu untuk tanggal tertentu, Anda dapat menggunakan kombinasi DATEPART () dan @@ datefirst . Kalau tidak, Anda tergantung pada pengaturan di server.
Lihatlah situs berikut untuk solusi yang lebih baik: MS SQL: Day of Week
Hari dalam seminggu akan berada dalam kisaran 0 hingga 6, di mana 0 adalah hari Minggu, 1 adalah hari Senin, dll. Kemudian Anda dapat menggunakan pernyataan kasus sederhana untuk mengembalikan nama hari kerja yang benar.
EROPA:
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
Dengan SQL Server 2012 dan seterusnya Anda dapat menggunakan FORMAT
fungsi ini
SELECT FORMAT(GETDATE(), 'dddd')
ini adalah salinan kode saya yang berfungsi memeriksanya, cara mengambil nama hari dari tanggal dalam sql
CREATE Procedure [dbo].[proc_GetProjectDeploymentTimeSheetData]
@FromDate date,
@ToDate date
As
Begin
select p.ProjectName + ' ( ' + st.Time +' '+'-'+' '+et.Time +' )' as ProjectDeatils,
datename(dw,pts.StartDate) as 'Day'
from
ProjectTimeSheet pts
join Projects p on pts.ProjectID=p.ID
join Timing st on pts.StartTimingId=st.Id
join Timing et on pts.EndTimingId=et.Id
where pts.StartDate >= @FromDate
and pts.StartDate <= @ToDate
END
Jika Anda tidak ingin bergantung @@DATEFIRST
atau menggunakan DATEPART(weekday, DateColumn)
, hitung sendiri hari dalam seminggu.
Untuk minggu berbasis Senin (Eropa) paling sederhana adalah:
SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay
Untuk minggu berbasis Minggu (Amerika) gunakan:
SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay
Ini mengembalikan angka hari kerja (1 hingga 7) sejak 1 Januari masing-masing 7, 1753.
Anda dapat menggunakan DATEPART(dw, GETDATE())
tetapi perlu diketahui bahwa hasilnya akan bergantung pada @@DATEFIRST
nilai pengaturan SQL server yang merupakan pengaturan hari pertama minggu (Di Eropa nilai default 7 yaitu hari Minggu).
Jika Anda ingin mengubah hari pertama dalam minggu ke nilai lain, Anda bisa menggunakan SET DATEFIRST
tetapi ini dapat memengaruhi di mana saja di sesi kueri yang tidak Anda inginkan.
Cara alternatif adalah dengan secara eksplisit menentukan nilai hari pertama minggu sebagai parameter dan menghindari tergantung pada @@DATEFIRST
pengaturan. Anda dapat menggunakan formula berikut untuk mencapainya saat membutuhkannya:
(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
di mana @WeekStartDay
adalah hari pertama dalam seminggu yang Anda inginkan untuk sistem Anda (dari 1 hingga 7 yang berarti dari Senin hingga Minggu).
Saya telah membungkusnya menjadi fungsi di bawah ini sehingga kami dapat menggunakannya kembali dengan mudah:
CREATE FUNCTION [dbo].[GetDayInWeek](@InputDateTime DATETIME, @WeekStartDay INT)
RETURNS INT
AS
BEGIN
--Note: @WeekStartDay is number from [1 - 7] which is from Monday to Sunday
RETURN (DATEPART(dw, @InputDateTime) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
END
Contoh penggunaan:
GetDayInWeek('2019-02-04 00:00:00', 1)
Ini sama dengan mengikuti (tetapi tidak tergantung pada pengaturan DATEFIRST SQL server):
SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')
Anda mungkin menemukan versi ini bermanfaat.
-- Test DATA
select @@datefirst
create table #test (datum datetime)
insert #test values ('2013-01-01')
insert #test values ('2013-01-02')
insert #test values ('2013-01-03')
insert #test values ('2013-01-04')
insert #test values ('2013-01-05')
insert #test values ('2013-01-06')
insert #test values ('2013-01-07')
insert #test values ('2013-01-08')
-- Test DATA
select Substring('Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun,Mon,Tue,Wed,Thu,Fri,Sat',
(DATEPART(WEEKDAY,datum)+@@datefirst-1)*4+1,3),Datum
from #test